This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/24047] New: internal compiler error: in instantiate_virtual_regs_lossage, at function.c:1442
- From: "hakim at atmos dot washington dot edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 24 Sep 2005 04:08:29 -0000
- Subject: [Bug fortran/24047] New: internal compiler error: in instantiate_virtual_regs_lossage, at function.c:1442
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
source below compiled by (and error thrown):
/usr/bin/gfortran -c invert.f90
invert.f90: In function 'invert':
invert.f90:80: internal compiler error: in instantiate_virtual_regs_lossage, at
function.c:1442
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
source (not dependency SPECTRAL.f90 is also appended below):
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SUBROUTINE invert(nlevs,tbsp,ttsp,pvsp,phi0b,phi0t,phi0)
USE spectral
! Originators: G. J. Hakim, University of Washington
!
! 14 July 2004; version 0.1
IMPLICIT NONE
! Invert PV for streamfunction; compute spectral derivatives on
! the transform (advection) grid.
integer, intent(in) :: nlevs
complex, intent(in), dimension(2*kmax,2*lmax) :: tbsp,ttsp
complex, intent(in), dimension(2*kmax,2*lmax,nlevs) :: pvsp
complex, intent(out), dimension(2*kmax,2*lmax) :: phi0b,phi0t
complex, intent(out), dimension(2*kmax,2*lmax,nlevs) :: phi0
complex, dimension(2*kmax,2*lmax,nlevs) :: bpvsp
complex, dimension(2*kmax,2*lmax,nlevs-1) :: pz
complex, dimension(2*kmax,2*lmax) :: pxx,pyy,pzz,errsp
real, dimension(2*kmax,2*lmax) :: errxy,tmpxy
real :: ak,bl,dz
integer :: j,k,l,kk,ll
complex, dimension(nlevs) :: psi
complex,dimension(2*kmax,2*lmax),save:: dx,dy,Id
dz = ZH/real(nlevs)
! derivative operators
call d_setup(dx,dy,Id)
! initialize arrays to zero:
phi0b=0.;phi0t=0.;phi0=0.
bpvsp = pvsp
do k=1,2*kmax; do l=1,2*lmax
! add boundary theta to a copy of spectral pv:
bpvsp(k,l,1) = bpvsp(k,l,1) + (tbsp(k,l)/dz)
bpvsp(k,l,nlevs) = bpvsp(k,l,nlevs) - (ttsp(k,l)/dz)
! get wavenumbers
call get_waves(k,l,ak,bl)
! spectral inversion (zero mean)
if (k .eq. 1 .and. l .eq. 1) then
phi0b(k,l) = 0.; phi0t(k,l) = 0.; phi0(k,l,:) = 0.
else
call matinv(nlevs,bpvsp(k,l,:),ak,bl,psi,1)
phi0b(k,l) = psi(1) - (0.5*dz*tbsp(k,l))
phi0t(k,l) = psi(nlevs) + (0.5*dz*ttsp(k,l))
phi0(k,l,:) = psi(:)
endif
enddo; enddo
! BEGIN leading-order PV check
! phi_xx + phi_yy + phi_zz = q
! first z-loop for phi_z at at intermediate levels
do k = 1,nlevs-1
pz(:,:,k) = (phi0(:,:,k+1) - phi0(:,:,k)) / dz
if (k .eq. 1) then
call sp_to_xy(tbsp,tmpxy,kmax,lmax,2*kmax,2*lmax)
print*,'theta maxval at surface: ',maxval(abs(tmpxy))
endif
call sp_to_xy(pz(:,:,k),tmpxy,kmax,lmax,2*kmax,2*lmax)
print*,'pz maxval at level ',k,' : ',maxval(abs(tmpxy))
enddo
! second z-loop for laplacian at grid levels and phi_zz; pv calc
do k = 1,nlevs
call d_s2s(phi0(:,:,k),pxx,1,dx*dx)
call d_s2s(phi0(:,:,k),pyy,1,dy*dy)
if (k .eq. 1) then
pzz = (pz(:,:,k) - tbsp) / dz
elseif (k .eq. nlevs) then
pzz = (ttsp - pz(:,:,k-1)) / dz
else
pzz = (pz(:,:,k) - pz(:,:,k-1)) / dz
endif
! this is critical to get the inversion to check; the mean is zero in the inversion
pzz(1,1) = 0.
errsp = pvsp(:,:,k) - (pxx + pyy + pzz)
call sp_to_xy(errsp,errxy,kmax,lmax,2*kmax,2*lmax)
print*,'max leading-order pv error at level ',k,' : ',maxval(abs(errxy))
call sp_to_xy(pxx+pyy,tmpxy,kmax,lmax,2*kmax,2*lmax)
print*,'max vort CHECK at level ',k,' : ',maxval(abs(tmpxy))
call sp_to_xy(pzz,tmpxy,kmax,lmax,2*kmax,2*lmax)
print*,'max pzz CHECK at level ',k,' : ',maxval(abs(tmpxy))
enddo
! END leading-order PV check
return
end SUBROUTINE invert
! SPECTRAL module
! v.3 6 September 2005
!
! a module to be used with spectral surface-based models.
!
MODULE spectral
integer, parameter :: model = 1 ! 1:2sQG; 2:sQG trop; 3:sQG sfc; 4:HsQG
real, parameter :: dt = 0.01 ! model time step
integer, parameter :: ntims = 101 ! number of model time steps
integer, parameter :: iplot = 100 ! plots every iplot time steps
integer, parameter :: imean = int(10.e3/dt) ! compute area mean every imean
logical, parameter :: iterr = .FALSE. ! flag for terrain
logical, parameter :: linear = .FALSE. ! flag for linear advection
logical, parameter :: trop = .FALSE. ! flag for tropopause geometry
real, parameter :: pi=3.14159265358979323846264338327950288419
integer, parameter:: kmax = 64/2 ! number of x waves
integer, parameter:: lmax = 64/2 ! number of y waves
integer, parameter:: n = 8 ! diffusion parameter
real, parameter :: tau = 10*dt ! diffusion time scale
real, parameter :: XL = 5.0 ! x domain length
real, parameter :: YL = 5.0 ! y domain length
real, parameter :: H = 1.0 ! z domain length
real, parameter :: Ross = 0.1 ! Rossby number
! real, parameter :: Ross = 0. ! Rossby number
real, parameter :: gamma=0.0 ! ekman parameter
! logical, parameter :: hw = .FALSE.! jet off
logical, parameter :: hw = .TRUE.! jet off
logical, parameter :: restart = .FALSE. ! use restart file for ic
logical, parameter :: grow = .FALSE. ! grow a normal mode
real, parameter :: amu = 1.0 ! HW jet parameter (0->1)
real, parameter :: shear = 1.0 ! shear parameter (1 for HW jet)
real, parameter :: trl = 1000 ! jet relaxation parameter (e-folding time)
logical, parameter :: cdf = .TRUE. ! write to netcdf files
! logical, parameter :: cdf = .FALSE. ! write to text ASCII files
character path*2; parameter (path='./') ! file location:
! do not modify below this point:
integer, parameter :: kmid=kmax/2,lmid=lmax/2,mmax=3.125*kmax, &
& nmax=3.125*lmax,l2=nmax-lmax,k2=mmax-kmax, &
& lmaxp1=lmax+1,kmaxp1=kmax+1
real, parameter :: facx=2.*pi/XL,facy=2.*pi/YL,eps=0.1
real, parameter :: amiss=-99.,hwp=5.539118,ryl=2.*pi/hwp
! START pvinv specific-------------------------------------------------------
real, parameter :: ZH = H ! z domain length
integer, parameter :: pmax = 11 ! number of vertical levels
! integer, parameter :: order = 0 ! leading-order only
! integer, parameter :: order = 1 ! first-order only
integer, parameter :: order = 2 ! use this for full inversion
CONTAINS
! scaling parameters:
SUBROUTINE scaling(grav,tnot,Ns,km,Cor,Ls,Hs,Us,Ws,Ps,Ts)
real, intent(out) :: grav,tnot,Ns,km,Cor,Ls,Hs,Us,Ws,Ps,Ts
grav = 9.81 ! gravitational constant (m s^-2)
tnot = 300. ! theta constant at Z = 0 (K)
Ns = 1.e-4 ! bouyancy frequency
km = 1000. ! 1000 m in a kilometer
Cor = 1.e-4 ! Coriolis parameter (s^-1)
Ls = 1000.*km ! horizontal length scale (m)
Hs = 10.*km ! vertical length scale (m)
if (Ross .ne. 0) then
Us = Ross*Cor*Ls ! Horizontal wind scale (m s^-1)
print*,'Us = ',Us
else
Us = 10.
endif
Ws = Ross*Hs*Us/Ls ! Vertical wind scale (m s^-1)
Ps = Us*Cor*Ls ! geopotential scale (m^2 s^-2)
Ts = Ps*tnot/(grav*Hs) ! potential temperature (K)
return
end SUBROUTINE scaling
! rolv's routine to get dimensional dx, dy, dz, and dt
SUBROUTINE dx_echo(dxs,dys,dzs,dts)
! send back dimensional values for dx, dy, dz, and dt.
real, intent(out) :: dxs,dys,dzs,dts
real :: grav,tnot,Ns,km,Cor,Ls,Hs,Us,Ws,Ps,Ts
call scaling(grav,tnot,Ns,km,Cor,Ls,Hs,Us,Ws,Ps,Ts)
dxs = Ls*XL/real(2*kmax) ! meters
dys = Ls*YL/real(2*kmax) ! meters
dzs = Hs*ZH/real(pmax) ! meters
dts = Ls*dt/Us ! seconds
return
end SUBROUTINE dx_echo
! END pvinv specific-------------------------------------------------------
ENDMODULE spectral
--
Summary: internal compiler error: in
instantiate_virtual_regs_lossage, at function.c:1442
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: critical
Priority: P2
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: hakim at atmos dot washington dot edu
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: ./gcc/configure --prefix=/usr/local/gfortran --enable-
languages=
GCC host triplet: gcc version 4.1.0 20050325 (experimental)
GCC target triplet: powerpc-apple-darwin7.8.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24047