howtos:how_to_compile_peakfq_on_linux
How to compile PeakFQ on Linux
First, install the Intel Fortran Compiler.
You can download the incomplete source code of PeakFQ from its website. Here, I'll use PeakFQ_7.5.1.src.zip. Visit its GitHub repository.
- compile_peakfq.sh
#!/bin/sh # download source code wget https://water.usgs.gov/software/PeakFQ/code/7.5.1/PeakFQ_7.5.1.src.zip # unzip it mkdir -p ~/usr/local/src unzip PeakFQ_7.5.1.src.zip -d ~/usr/local/src cd ~/usr/local/src mv PeakFQ_7.5.1.src/src/FORTRAN peakfq rm -rf PeakFQ_7.5.1.src cd peakfq # rename all filenames to lowercase for i in *.*; do j=$(echo $i | tr A-Z a-z) [ $i = $j ] || mv $i $j done # rename include and module names in source files to lowercase for i in *.*; do grep -q ".*.INC'" $i || continue for j in $(grep ".*.INC'" $i | sort -u | sed 's/\r//; '"s/^[^']*'\|'$//g"); do k=$(echo $j | tr A-Z a-z) sed -i "s/$j/$k/" $i done done # move DENYNONE from ACTION to SHARE sed -Ei "s/(, )(DENYNONE)/'\1SHARE='\2/" wdoppc90.for # comment out non-existent modules and data types sed -Ei 's/^(.*(KERNEL32|T_OVERLAPPED))/!\1/' scenmod.f90 # comment out Windows functions sed -Ei 's/^(.*(PeekNamedPipe|ReadFile|WriteFile))/!\1/' scenmod.f90 # fix disclaimer line sed -i "/^ *WRITE(DISCLM(1)/a \ DISCLM(2) = ''\r" j407xe.for # reenable default generalized skew computation sed -Ei 's/^C(.*GENSKU *=.*)/\1/; s/^Cprh( {6}AUX)/\1/; s/^( {6}AUX\(1\) = -999)/!\1/' j407xe.for # download missing files for i in \ adwdm/cfbuff.inc \ adwdm/cdrloc.inc \ adwdm/fmsgwd.inc \ adwdm/utwdmd.for \ adwdm/utwdmf.for \ adwdm/utwdt1.for \ adwdm/wdatm1.for \ adwdm/wdmchk.for \ adwdm/wdmess.for \ wdm/ctsbuf.inc \ wdm/cwdmid.inc \ wdm/cwtsds.inc \ wdm/tsbufr.for \ wdm/wdatm2.for \ wdm/wdatrb.for \ wdm/wdatru.for \ wdm/wdbtch.for \ wdm/wdmid.for \ wdm/wdtms1.for \ wdm/wdtms2.for \ ; do wget https://svn.oss.deltares.nl/repos/openda/trunk/model_hspf/fortran/libanne4.0/src/$i done # dos to unix for i in * */*; do sed -i 's/\r//' $i done # create main.f90 cat << 'EOT' > main.f90 character(len=256) :: specfile if(command_argument_count().eq.0) then write(*,*) "Usage: peakfq specfile" else call get_command_argument(1, specfile) call peakfq(specfile) endif end EOT # create Makefile cat << 'EOT' > Makefile FC=ifx LDFLAGS=-nofor-main all: peakfq clean: $(RM) *.o EMAUtil/*.o *.mod peakfq peakfq: \ main.o \ EMAUtil/dcdflib1.o \ EMAUtil/imslfake.o \ EMAUtil/probfun.o \ compspecs.o \ datsys90.o \ emafit.o \ emathresh.o \ j407wc.o \ j407xe.o \ ktutil.o \ peakfq.o \ pkfqsta.o \ pkwdm.o \ qfdprs.o \ scenmod.o \ stationdata.o \ stgaus.o \ stutil.o \ tsbufr.o \ utchar.o \ utcpgn.o \ utdate.o \ utgnrl.o \ utj407.o \ utnumb.o \ utstat.o \ utwdmd.o \ utwdmf.o \ utwdt1.o \ wdatm1.o \ wdatm2.o \ wdatrb.o \ wdatru.o \ wdbtch.o \ wdmchk.o \ wdmess.o \ wdmid.o \ wdoppc90.o \ wdpeak.o \ wdtble.o \ wdtms1.o \ wdtms2.o $(FC) $(LDFLAGS) -o $@ $^ peakfq.o: emathresh.o compspecs.o pkfqsta.o: scenmod.o j407xe.o: emathresh.o stationdata.o j407wc.o: emathresh.o %.o: %.f90 $(FC) $(FFLAGS) -c -o $@ $< %.o: %.for $(FC) $(FFLAGS) -c -o $@ $< EOT # build make # install PeakFQ for Windows; find and copy pkfqms.wdm in lowercase # download it from this website wget https://clawiki.isnew.info/_media/howtos/pkfqms.zip unzip pkfqms.zip rm pkfqms.zip
You don't need to run this command, but I used it to find undefined references:
# see what symbols are undefined for i in $(make &> /dev/stdout | grep "undefined reference" | sed 's/.*`//; s/_.*//' | sort -u); do if ! grep -qiE "(function|subroutine) *$i" *.* */*.*; then echo "$i: NOT FOUND" fi done
howtos/how_to_compile_peakfq_on_linux.txt · Last modified: by hcho