[Wrf-users] WRFSI built with g95: success, but ...
Arnold Moene
arnold.moene at wur.nl
Wed Feb 23 16:23:16 MST 2005
L.S.,
After some tweaking and contact with the main developer of the GNU Fortran 95
compiler (g95) I've managed to build WRFSI with g95 (version gcc version 4.0.0
20050129 (experimental) (g95!) Feb 16 2005) on Linux i586.
The changes I had to make are listed below, with some comments to explain the
reasons for the changes. Apart from a number of defendable changes, there also
appeared to be a number of non-standard constructs in the code (according to
Andy Vaught, g95 developer). It would be nice if those non-standard things
could be changed.
I hope this is useful to others.
Regards, Arnold Moene
PS: Here comes the diff (comments preceded by #, first lines are from the *new*
code)
# FLOAT appears to be a specific intrinsic that only works with
# 4-byte integers. The generic function is REAL
diff -r wrfsi/src/grid/alt_all.f wrfsi.orig/src/grid/alt_all.f
991c991
< sum=sum+real(datain(III,JJJ))
---
> sum=sum+float(datain(III,JJJ))
1056c1056
< sum=sum+(out2d(I,J)-real(datain(III,JJJ)))**2.
---
> sum=sum+(out2d(I,J)-float(datain(III,JJJ)))**2.
# The standard way of indicating octal numbers is with the 'O'
# preceding the string, rather than following it.
diff -r wrfsi/src/grid/gridgen_utils.f wrfsi.orig/src/grid/gridgen_utils.f
930,931c930,931
< BIT_1 = O'200' ! BINARY '10000000'
< BIT_2 = O'377' ! BINARY '11111111'
---
> BIT_1 = '200'O ! BINARY '10000000'
> BIT_2 = '377'O ! BINARY '11111111'
# The -DUSE_TRIGD is needed to make sure that trigd.mod is generated, since
# g95 does not know DCOSD etc.
diff -r wrfsi/src/include/makefile_pc.inc.in
wrfsi.orig/src/include/makefile_pc.inc.in
8c8
< DEFS=-Di686 -DDEC -DBIT32 -DF90 -DFORTRANDOUBLEUNDERSCORE -DDYNAMIC
-DUSE_TRIGD
---
> DEFS=-Di686 -DDEC -DBIT32 -DF90 -DFORTRANUNDERSCORE -DDYNAMIC
# Of course ;)
14c14
< FC = g95
---
> FC = pgf90
# The addition of $(DEFS) is needed to make sure that trigd.mod is built
# changes to FIXED and FREE are simply compiler specific
20,23c20,23
< FFLAGS = $(INC) -O2 $(DEFS)
< DBFLAGS = $(INC) -g -C $(DEFS)
< FIXED=-ffixed-form
< FREE=-ffree-form
---
> FFLAGS = $(INC) -O2 -byteswapio
> DBFLAGS = $(INC) -g -C -byteswapio
> FIXED=-Mfixed
> FREE=-Mfree
# The -P is needed to let cpp work with non-C code graciously.
28c28
< CPP = cpp -traditional-cpp -P
---
> CPP = pgf90 -E
# The addition of -I$(SRCROOT)/src/lib is needed to make trigd.mod available
# to other code as well.
36c36
< INC = -I$(SRCROOT)/src/include -I$(NETCDF)/include -I$(SRCROOT)/src/mod
-I$(SRCROOT)/src/io_netcdf -I$(SRCROOT)/src/lib
---
> INC = -I$(SRCROOT)/src/include -I$(NETCDF)/include -I$(SRCROOT)/src/mod
-I$(SRCROOT)/src/io_netcdf
# Switch on trigd module
diff -r wrfsi/src/include/trigd.inc wrfsi.orig/src/include/trigd.inc
5c5
< use trigd
---
> C use trigd
# IACHAR just wants *one* character as its argument. Don't know why other
# compilers swallow this.
diff -r wrfsi/src/io_netcdf/wrf_io.F90 wrfsi.orig/src/io_netcdf/wrf_io.F90
482c482
< if('A'<=c .and. c <='Z') MemOrd(i:i)=achar(iachar(c(1:1))+upper_to_lower)
---
> if('A'<=c .and. c <='Z') MemOrd(i:i)=achar(iachar(c)+upper_to_lower)
499c499
< if('a'<=c .and. c <='z') MemOrd(i:i)=achar(iachar(c(1:1))+lower_to_upper)
---
> if('a'<=c .and. c <='z') MemOrd(i:i)=achar(iachar(c)+lower_to_upper)
# Put $(BIGFOBJS) before $(FOBJS) to make sure that trigd.mod gets built
# before the object files that need it
diff -r wrfsi/src/lib/Makefile wrfsi.orig/src/lib/Makefile
110c110
< $(LIB): $(COBJS) $(BIGFOBJS) $(FOBJS)
---
> $(LIB): $(COBJS) $(FOBJS) $(BIGFOBJS)
# Also remove *.mod when doing make clean
119c119
< $(RM) $(FOBJS) $(BIGFOBJS) $(COBJS) core *.a *.mod
---
> $(RM) $(FOBJS) $(BIGFOBJS) $(COBJS) core *.a
# The specification of hexadecimal numbers with an X following the string
# is non-standard; should be with Z preceding the string
diff -r wrfsi/src/lib/w3lib/gbytes.f wrfsi.orig/src/lib/w3lib/gbytes.f
25,37c25,30
< DATA MASKS /Z'1',Z'3',Z'7',Z'F',Z'1F',Z'3F',Z'7F',Z'FF',
< +Z'1FF',Z'3FF',Z'7FF',Z'FFF', Z'1FFF',Z'3FFF',Z'7FFF',Z'FFFF',
< +Z'1FFFF', Z'3FFFF', Z'7FFFF', Z'FFFFF',
< +Z'1FFFFF', Z'3FFFFF', Z'7FFFFF', Z'FFFFFF',
< +Z'1FFFFFF', Z'3FFFFFF', Z'7FFFFFF', Z'FFFFFFF',
< +Z'1FFFFFFF', Z'3FFFFFFF', Z'7FFFFFFF', Z'FFFFFFFF'/
<
< c DATA MASKS /'1'X,'3'X,'7'X,'F'X, '1F'X,'3F'X,'7F'X,'FF'X,
< c +'1FF'X,'3FF'X,'7FF'X,'FFF'X, '1FFF'X,'3FFF'X,'7FFF'X,'FFFF'X,
< c +'1FFFF'X, '3FFFF'X, '7FFFF'X, 'FFFFF'X,
< c +'1FFFFF'X, '3FFFFF'X, '7FFFFF'X, 'FFFFFF'X,
< c +'1FFFFFF'X, '3FFFFFF'X, '7FFFFFF'X, 'FFFFFFF'X,
< c +'1FFFFFFF'X, '3FFFFFFF'X, '7FFFFFFF'X, 'FFFFFFFF'X/
---
> DATA MASKS /'1'X,'3'X,'7'X,'F'X, '1F'X,'3F'X,'7F'X,'FF'X,
> +'1FF'X,'3FF'X,'7FF'X,'FFF'X, '1FFF'X,'3FFF'X,'7FFF'X,'FFFF'X,
> +'1FFFF'X, '3FFFF'X, '7FFFF'X, 'FFFFF'X,
> +'1FFFFF'X, '3FFFFF'X, '7FFFFF'X, 'FFFFFF'X,
> +'1FFFFFF'X, '3FFFFFF'X, '7FFFFFF'X, 'FFFFFFF'X,
> +'1FFFFFFF'X, '3FFFFFFF'X, '7FFFFFFF'X, 'FFFFFFFF'X/
# CHAR wants an integer as its argument, not a logical
diff -r wrfsi/src/lib/w3lib/sbytesc.f wrfsi.orig/src/lib/w3lib/sbytesc.f
35c35
< out(index) = char(int(or(itmp2,itmp3)))
---
> out(index) = char(or(itmp2,itmp3))
45c45
< out(index) = char(int(and(itmp,255)))
---
> out(index) = char(and(itmp,255))
56c56
< out(index) = char(int(or(itmp2,itmp3)))
---
> out(index) = char(or(itmp2,itmp3))
# The specification of hexadecimal numbers with an X following the string
# is non-standard; should be with Z preceding the stri
diff -r wrfsi/src/lib/w3lib/sbytes.f wrfsi.orig/src/lib/w3lib/sbytes.f
26,38c26,31
< DATA MASKS /Z'1',Z'3',Z'7',Z'F',Z'1F',Z'3F',Z'7F',Z'FF',
< +Z'1FF',Z'3FF',Z'7FF',Z'FFF', Z'1FFF',Z'3FFF',Z'7FFF',Z'FFFF',
< +Z'1FFFF', Z'3FFFF', Z'7FFFF', Z'FFFFF',
< +Z'1FFFFF', Z'3FFFFF', Z'7FFFFF', Z'FFFFFF',
< +Z'1FFFFFF', Z'3FFFFFF', Z'7FFFFFF', Z'FFFFFFF',
< +Z'1FFFFFFF', Z'3FFFFFFF', Z'7FFFFFFF', Z'FFFFFFFF'/
<
< c DATA MASKS /'1'X,'3'X,'7'X,'F'X, '1F'X,'3F'X,'7F'X,'FF'X,
< c +'1FF'X,'3FF'X,'7FF'X,'FFF'X, '1FFF'X,'3FFF'X,'7FFF'X,'FFFF'X,
< c +'1FFFF'X, '3FFFF'X, '7FFFF'X, 'FFFFF'X,
< c +'1FFFFF'X, '3FFFFF'X, '7FFFFF'X, 'FFFFFF'X,
< c +'1FFFFFF'X, '3FFFFFF'X, '7FFFFFF'X, 'FFFFFFF'X,
< c +'1FFFFFFF'X, '3FFFFFFF'X, '7FFFFFFF'X, 'FFFFFFFF'X/
---
> DATA MASKS /'1'X,'3'X,'7'X,'F'X, '1F'X,'3F'X,'7F'X,'FF'X,
> +'1FF'X,'3FF'X,'7FF'X,'FFF'X, '1FFF'X,'3FFF'X,'7FFF'X,'FFFF'X,
> +'1FFFF'X, '3FFFF'X, '7FFFF'X, 'FFFFF'X,
> +'1FFFFF'X, '3FFFFF'X, '7FFFFF'X, 'FFFFFF'X,
> +'1FFFFFF'X, '3FFFFFF'X, '7FFFFFF'X, 'FFFFFFF'X,
> +'1FFFFFFF'X, '3FFFFFFF'X, '7FFFFFFF'X, 'FFFFFFFF'X/
# CHAR wants an integer as its argument, not a logical
diff -r wrfsi/src/lib/w3lib/w3fi74.f wrfsi.orig/src/lib/w3lib/w3fi74.f
355c355
< GDS(17) = CHAR(int(OR(IGDS(8),ISHFT(ICOMP,3))))
---
> GDS(17) = CHAR(OR(IGDS(8),ISHFT(ICOMP,3)))
--
------------------------------------------------------------------------
Arnold F. Moene NEW tel: +31 (0)317 482604
Meteorology and Air Quality Group fax: +31 (0)317 482811
Wageningen University e-mail: Arnold.Moene at wur.nl
Duivendaal 2 url: http://www.met.wau.nl
6701 AP Wageningen
The Netherlands
------------------------------------------------------------------------
Openoffice.org - Freedom at work
Firefox - The browser you can trust (www.mozilla.org)
------------------------------------------------------------------------
More information about the Wrf-users
mailing list