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