声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6240|回复: 18

[Fortran] 请教:请高手帮忙诊断这个错误可能错在那里?

[复制链接]
发表于 2008-8-3 10:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我在运行一个用fortran77编写的一个程序后,出现一出错误:
Linking...
.\Debug\0.obj : fatal error LNK1136: invalid or corrupt file
Error executing link.exe.

0.exe - 1 error(s), 0 warning(s)

不胜感激!!
回复
分享到:

使用道具 举报

发表于 2008-8-3 17:39 | 显示全部楼层
.
    贴出源代码也许好看一些,仅仅根据错误提示分析是很难的. ..
 楼主| 发表于 2008-8-3 19:27 | 显示全部楼层

诊断

嗯,好的,教授
【抱歉,多少是有点长了】
还真的希望各位fortran高州帮忙看看:


! *******************************************
! *******************************************

!           GRID-0.98

!  *******************************************
!   *******************************************

      subroutine grid

      include 'param-0.98.inc'
      include 'com-0.98.inc'
         

!     s grid parameters: gridding for parallel dynamics

      real s(nz,nf)
      real qs(nz,nf)
      real xs(nz,nf),ys(nz,nf),zs(nz,nf)
      real brs(nz,nf)

!     p grid parameters: gridding for perpendicular dynamics

      real qp(nzp1,nfp1),pp(nzp1,nfp1)
      real xp(nzp1,nfp1,2),yp(nzp1,nfp1,2),zp(nzp1,nfp1,2)
      real brp(nzp1,nfp1),blatp(nzp1,nfp1),blonp(nzp1,nfp1)
      real grp(nzp1,nfp1),glatp(nzp1,nfp1),glonp(nzp1,nfp1)
      real altp(nzp1,nfp1)

      do j = 1,nf
        k    = nf + 1 - j
        dx   = float(j-1)/float(nf-1)
        x2   = dx * sinh ( gamp )
        x3   = alog ( x2 + sqrt ( x2**2 + 1. ) ) / gamp
        grad_inp(k) = rmin + ( rmax - rmin ) * ( 1. - x3 )
      enddo

      call igrf_sub(glon_in)

! MS: Incorporate eccentric dipole fit to IGRF.  The fit was done by
! taken swaths in geographic longitude and fitting the best eccentric
! dipole.  We want the simulation plane to go through the point
! specified in the namelist, but the fit is done in terms of
! geographic longitude at the equator.  So iterate: Take a guess at
! an initial geographic longitude and find the eccentric dipole
! parameters. Find the magnetic longitude (use gtob_norm) of the
! namelist point and a point at the equator.  Are the two magnetic
! longitudes the same?  If not, adjust the guess for the geographic
! longitude and try again.  Rinse, repeat, wipe hands on pants.

! MS: Note that since the magnetic field is tilted (and SAMI models
! one magnetic longitude) points far away from the equator will not be
! correct.  They are at different geographic longitudes so their IGRF
! parameters will be different (and hence the g to b to g conversions
! will be different). I'm not yet sure how significant a problem this
! is.

       phitemp = 0.

       do j = 1,20
         call igrf_sub(phitemp)
         call gtob ( temp1,temp2,temp3,grad_in+re,glat_in,glon_in )
         call gtob ( brad,blon0,blat,grad_in+re,0.,phitemp )
         phitemp = phitemp + (temp2-blon0) + 360.
         phitemp = mod(phitemp,360.)
       enddo

! MS: Check for convergence

       if (abs(temp2-blon0) .gt. 1.e-2) then
         print *,'Failure to converge to initial magnetic latitude.'
         stop
       endif


      call gtob (  brad,blon0,blat
     .            ,grad_in+re
     .            ,glat_in
     .            ,glon_in          )


      pvalue0  = brad / re / cos(blat*po180) ** 2
      rgmin    = altmin + re
        
      call btog ( pvalue0*re,blon0,0.
     .           ,grad_max
     .           ,glat_max
     .           ,glon_max             )

!     s grid

      do j = 1,nf

        i    = 0
        delp = .01 / re
        delg = grad_inp(j)

        do while ( abs(delg) .gt. .01 )
          if ( grad_inp(j) + re .lt. grad_max .and. j .eq. 1 ) then
                pvalue = pvalue0 - i * delp
          else
                pvalue = pvalue0 + i * delp
          endif
          call btog ( pvalue*re,blon0,0.
     .               ,grad
     .               ,glat
     .               ,glon                 )
          delg = grad_inp(j) + re - grad
          i = i + 1
        enddo

        pvalue0 = pvalue

!        print *, ' j,grad_inp(j),pvalue',j,grad_inp(j),pvalue

!       north minimum: find q value at northern most point

        blata   = 0.
        blatb   = 60.
        blatc   = 0.5 * ( blata + blatb )
        rba     = pvalue * re * cos ( blata * po180 ) ** 2
        rbb     = pvalue * re * cos ( blatb * po180 ) ** 2
        rbc     = pvalue * re * cos ( blatc * po180 ) ** 2
        call  btog ( rba,blon0,blata,rga,glat,glon )
        call  btog ( rbb,blon0,blatb,rgb,glat,glon )
        call  btog ( rbc,blon0,blatc,rgc,glat,glon )
        delrg   = .01
        delrc   = abs ( rgc - rgmin )
        qminn   = ( re / rbc ) ** 2 * sin ( blatc * po180 )

        iminn   = 0

        do while ( delrc .gt. delrg .and. iminn .lt. 20)
          iminn   = iminn + 1
          if ( rgc .lt. rgmin ) blatb = blatc
          if ( rgc .gt. rgmin ) blata = blatc
          blatc   = 0.5 * ( blata + blatb )
          rbc     = pvalue * re * cos ( blatc * po180 ) ** 2
          call  btog ( rbc,blon0,blatc,rgc,glat,glon )
          delrc   = abs ( rgc - rgmin )
          qminn   = ( re / rbc ) ** 2 * sin ( blatc * po180 )
        enddo

!       south minimum: find q value at southern most point

        blata   = 0.
        blatb   = -60.
        blatc   = 0.5 * ( blata + blatb )
        rba     = pvalue * re * cos ( blata * po180 ) ** 2
        rbb     = pvalue * re * cos ( blatb * po180 ) ** 2
        rbc     = pvalue * re * cos ( blatc * po180 ) ** 2
        call  btog ( rba,blon0,blata,rga,glat,glon )
        call  btog ( rbb,blon0,blatb,rgb,glat,glon )
        call  btog ( rbc,blon0,blatc,rgc,glat,glon )

        delrg   = .01
        delrc   = abs ( rgc - rgmin )
        qmins   = ( re / rbc ) ** 2 * sin ( blatc * po180 )

        imins   = 0

        do while ( delrc .gt. delrg )
          imins   = imins + 1
          if ( rgc .lt. rgmin ) blatb = blatc
          if ( rgc .gt. rgmin ) blata = blatc
          blatc   = 0.5 * ( blata + blatb )
          rbc     = pvalue * re * cos ( blatc * po180 ) ** 2
          call  btog ( rbc,blon0,blatc,rgc,glat,glon )
          delrc   = abs ( rgc - rgmin )
          qmins   = ( re / rbc ) ** 2 * sin ( blatc * po180 )
          rbms    = rbc
        enddo

!       determine distribution of points (q,s) along field line
!       see red book p. 249 (millward et al.)

        r    = rbms

        nzh   = (nz-1)/2
        delqs = qmins
        delqn = qminn

!       firs half of field line

        do i = 1,nzh+1

          x    = -1. + ( float(i) - 1 ) / float(nzh)
          xx   = x * sinh ( gams * qmins )
          qtmp = -alog ( xx + sqrt ( xx**2 + 1. ) ) / gams

!         x    = -1. + 2. * ( float(i) - 1 ) / float(nz-1)
!         xx   = x/2. * ( sinh(gams*qminn) * (x+1) +
!     .                   sinh(gams*qmins) * (x-1) )
!         qtmp = alog ( xx + sqrt ( xx**2 + 1. ) ) / gams

          r = re*qp_solve(qtmp,pvalue)
         
          qs(i,j)       = qtmp
          ps(i,j)       = pvalue
          brs(i,j)      = r
          br_norm       = r / re
          blats(i,j)  = asin ( qs(i,j) * br_norm ** 2 ) * rtod
          call btog ( brs(i,j),blon0,blats(i,j),
     .                grs(i,j),glats(i,j),glons(i,j) )

!         we need to calculate some quantities which depend on the usual
!         angular definition of theta

          theta = acos ( qs(i,j) * (brs(i,j)/re) ** 2 )  ! theta is in radians

!         get the dimensionless magnetic field: bm = b/b0
!         and sine / cosine of dip angle

          bms(i,j) = sqrt ( ( 2. * cos(theta) ) ** 2
     .                           + sin(theta)   ** 2 ) / br_norm ** 3

!          sindips(i,j) = 2.* cos (theta) / ( bms(i,j) * br_norm **3 )
!          cosdips(i,j) =     sin (theta) / ( bms(i,j) * br_norm **3 )

          call vector( brs(i,j),blon0,blats(i,j),
     .                 arg(i,j),athg(i,j),aphig(i,j) )


!         we define the dimensional grid points given by s = q * re

          s(i,j)  = qs(i,j)  * re
          alts(i,j) = grs(i,j) - re   ! altitude above earth

!         grid in cartesian coordinates

          xs(i,j)    = brs(i,j) * cos( blats(i,j)*po180 ) *
     .                            sin( blon0     *po180 )
          ys(i,j)    = brs(i,j) * sin( blats(i,j)*po180 )
          zs(i,j)    = brs(i,j) * cos( blats(i,j)*po180 ) *
     .                            cos( blon0     *po180 )

        enddo

!       second half of field line

        do i = nz,nzh+2,-1

          x    = ( float(i) - ( float(nzh) + 1.) ) / float(nzh)
          xx   = x * sinh ( gams * qminn )
          qtmp = alog ( xx + sqrt ( xx**2 + 1. ) ) / gams

!         x    = -1. + 2. * ( float(i) - 1 ) / float(nz-1)
!         xx   = x/2. * ( sinh(gams*qminn) * (x+1) +
!     .                   sinh(gams*qmins) * (x-1) )
!         qtmp = alog ( xx + sqrt ( xx**2 + 1. ) ) / gams

          r = re*qp_solve(qtmp,pvalue)
         
          qs(i,j)       = qtmp
          ps(i,j)       = pvalue
          brs(i,j)      = r
          br_norm       = r / re
          blats(i,j)  = asin ( qs(i,j) * br_norm ** 2 ) * rtod
          call btog ( brs(i,j),blon0,blats(i,j),
     .                grs(i,j),glats(i,j),glons(i,j) )

!         we need to calculate some quantities which depend on the usual
!         angular definition of theta

          theta = acos ( qs(i,j) * (brs(i,j)/re) ** 2 )  ! theta is in radians

!         get the dimensionless magnetic field: bm = b/b0
!         and sine / cosine of dip angle

          bms(i,j) = sqrt ( ( 2. * cos(theta) ) ** 2
     .                           + sin(theta)   ** 2 ) / br_norm ** 3

!          sindips(i,j) = 2.* cos (theta) / ( bms(i,j) * br_norm **3 )
!          cosdips(i,j) =     sin (theta) / ( bms(i,j) * br_norm **3 )

          call vector( brs(i,j),blon0,blats(i,j),
     .                 arg(i,j),athg(i,j),aphig(i,j) )

!         we define the dimensional grid points given by s = q * re

          s(i,j)  = qs(i,j)  * re
          alts(i,j) = grs(i,j) - re   ! altitude above earth

!         grid in cartesian coordinates

          xs(i,j)    = brs(i,j) * cos( blats(i,j)*po180 ) *
     .                            sin( blon0     *po180 )
          ys(i,j)    = brs(i,j) * sin( blats(i,j)*po180 )
          zs(i,j)    = brs(i,j) * cos( blats(i,j)*po180 ) *
     .                            cos( blon0     *po180 )

        enddo

      enddo ! j loop (number of field lines)

!     following distances are in cm
     
      do j = 1,nf
        do i = 2,nz-1
          ds(i,j)   = ( s(i,j)   - s(i-1,j) ) * 1.e5
          d2s(i,j)  = ( s(i+1,j) - s(i-1,j) ) * 1.e5
          d22s(i,j) = .5 * d2s(i,j)
        enddo
        ds(1,j)    = ds(2,j)
        ds(nz,j)   = ds(nz-1,j)
        d2s(1,j)   = d2s(2,j)
        d2s(nz,j)  = d2s(nz-1,j)
        d22s(1,j)  = d22s(2,j)
        d22s(nz,j) = d22s(nz-1,j)
      enddo

!     calculate dels: grid length along field line using cartesian geometry
!     and convert to cm from km

      do j = 1,nf
        do i = 1,nz-1
          x2  = ( xs(i+1,j) - xs(i,j) ) ** 2
          y2  = ( ys(i+1,j) - ys(i,j) ) ** 2
          zz2 = ( zs(i+1,j) - zs(i,j) ) ** 2
          dels(i,j) = sqrt ( x2 + y2 + zz2 ) * 1.e5
        enddo
        dels(nz,j) = dels(nz-1,j)
      enddo

!     calculate indices iz300s and iz300n
!     i.e., where field lines (s mesh) is at 300 km

      do j = 1,nf
        i = 1
        do while ( alts(i,j) .le. 300. .and. i .lt. nz )
          iz300s(j) = i
          i         = i + 1
        enddo
      enddo

      do j = 1,nf
        i = nz
        do while ( alts(i,j) .le. 300. .and. i .gt. 1 )
          iz300n(j) = i
          i         = i - 1
        enddo
      enddo

!     now do gridding for p mesh

!     calculate new set of q's  (qp)   

      do j = 1,nf
        do i = 1,nz-1
          qp(i+1,j) = 0.5 * ( qs(i,j) + qs(i+1,j) )
        enddo
        qp(1,j)    = qs(1,j)  + 0.5 * ( qs(1,j) - qs(2,j) )
        qp(nzp1,j) = qs(nz,j) + 0.5 * ( qs(nz,j) - qs(nz-1,j) )
      enddo
      do i = 1,nzp1
        qp(i,nfp1) = qp(i,nf) + ( qp(i,nf) - qp(i,nf-1) )
      enddo

      do i = 1,nz
        do j = 1,nf-1
          pp(i,j+1) = 0.5 * ( ps(i,j) + ps(i,j+1) )
        enddo
        pp(i,1)    = ps(i,1)  + 0.5 * ( ps(i,1)  - ps(i,2)    )
        pp(i,nfp1) = ps(i,nf) + 0.5 * ( ps(i,nf) - ps(i,nf-1) )
      enddo
      do j = 1,nfp1
        pp(nzp1,j) = pp(nz,j) + 0.5 * ( pp(nz,j) - pp(nz-1,j) )
      enddo

!     now calculate the grid for nfp1 to 1

      do j = nfp1,1,-1
        do i = 1,nzp1
          pvalue   = pp(i,j)
          if ( j .eq. nfp1 .and. i .ne. nzp1 ) then
            r    = brs(i,nf)
          elseif ( j .eq. nfp1 .and. i .eq. nzp1 ) then
            r    = brs(nz,nf)
          else
            r    = brp(i,j+1)
          endif
          qtmp = qp(i,j)
          r    = re*qp_solve(qtmp,pvalue)

          brp(i,j)    = r
          br_norm     = r / re
          blatp(i,j)  = asin ( qp(i,j) * br_norm ** 2 ) * rtod
          blonp(i,j)  = blon0

          call btog ( brp(i,j),blonp(i,j),blatp(i,j),
     .                grp(i,j),glatp(i,j),glonp(i,j) )

          altp(i,j)   = grp(i,j) - re

          delphi =  5.
          blon1  =  blon0 - delphi
          if ( blon1 .ge. 360. ) blon1 = blon1 - 360.
          blon2  =  blon0 + delphi
          if ( blon2 .ge. 360. ) blon2 = blon2 - 360.

!         grid in cartesian coordinates

          xp(i,j,1)   = brp(i,j) * cos( blatp(i,j) * po180 ) *
     .                             sin( blon1      * po180 )
          yp(i,j,1)   = brp(i,j) * sin( blatp(i,j) * po180 )
          zp(i,j,1)   = brp(i,j) * cos( blatp(i,j) * po180 ) *
     .                             cos( blon1      * po180 )

          xp(i,j,2)   = brp(i,j) * cos( blatp(i,j) * po180 ) *
     .                             sin( blon2      * po180 )
          yp(i,j,2)   = brp(i,j) * sin( blatp(i,j) * po180 )
          zp(i,j,2)   = brp(i,j) * cos( blatp(i,j) * po180 ) *
     .                             cos( blon2      * po180 )
        enddo
      enddo

!     calculate geometric parameters: cell area and volume

!     vol is cell volume

      call volume ( xp,yp,zp )

!     areap is cell face area in j-direction (p)
!     areas is cell face area in i-direction (s)

      call area ( xp,yp,zp )

!     xdels is line distance in i-direction (s)
!     xdelp is line distance in j-direction (p)
!     xdelh is line distance in k-direction (phi)

      call line ( xp,yp,zp )

!     normal: calculates normal to cell face in s-direction
!     vnormal: calcuates e x b direction

      call  normal ( xp,yp,zp )
      call vnormal ( qs,blon0,brs )

      end

! *******************************************
! *******************************************

!            gtob

! *******************************************
! *******************************************

      subroutine gtob(brad,blond,blatd,grad,glatd,glond)

!     conversion from geographic to
!     offset centered dipole coordinates
!     brad: radius in the offset dipole system
!     grad: radius in the geocentric system
!     (g joyce june 1998)

      include 'param-0.98.inc'
      include 'com-0.98.inc'

!     coordinates of dipole in km relative to center of earth

!      x0 = -392.
!      y0 =  258.
!      z0 =  179.

!     convert to radians

      glat = glatd * po180
      glon = glond * po180

!     rotate in longitude

      xg = grad * cos ( glat ) * cos ( glon - plon )
      yg = grad * cos ( glat ) * sin ( glon - plon )
      zg = grad * sin ( glat )

!     rotate in latitude

      xmm = xg * sin ( plat ) - zg * cos ( plat )
      ymm = yg
      zmm = xg * cos ( plat ) + zg * sin ( plat )

!     calculate offset in geographic polar (p. 248 redbook)

      d = sqrt(x0**2 + y0**2 + z0**2)
      thd = acos( z0/d )
      phd = atan2( y0,x0 )

!     change to colatitude

      cotn = pie/2. - plat
      phin = plon

!     calculate offset in cartesian rotated system

      thp = acos(cos(cotn)*cos(thd)
     .     + sin(cotn)*sin(thd)*cos(phd-phin))
      cosphp = ( cos(cotn)*cos(thp) - cos(thd) )
     .         / (sin(cotn) * sin(thp))
      sinphp = sin(thd) * sin(phd-phin) / sin(thp)

      x0p = d*sin(thp)*cosphp
      y0p = d*sin(thp)*sinphp
      z0p = d*cos(thp)


!     geomagnetic latitude and longitude in degrees

      xm = xmm - x0p
      ym = ymm - y0p
      zm = zmm - z0p

!     magnetic lat and long converted to degrees

      brad  = sqrt ( xm ** 2 + ym ** 2 + zm ** 2 )
      blatd = asin ( zm / brad ) * rtod
      blond = ( atan2 ( ym/brad,xm/brad ) ) * rtod
      if (blond .lt. -0.01) blond = blond+360.

      return
      end

! *******************************************
! *******************************************

!            btog

! *******************************************
! *******************************************


      subroutine btog ( brad,blond,blatd,grad,glatd,glond )

!     conversion from centered dipole to geographic coordinates
!     plat,plon =  coords of north magnetic pole (in param2d.9.14e.inc)
!     the geomagnetic longitude is measured east from the
!     geomagnetic prime meridian at 291 degrees east geographic.
!     brad: radius in the offset dipole frame
!     grad: radius in the geocentric frame
!     (g joyce june 1998)

      include 'param-0.98.inc'
      include 'com-0.98.inc'

      real brad,blond,blatd,grad,glatd,glond

!     coordinates of dipole in km relatvie to center of earth

!      x0 = -392.
!      y0 =  258.
!      z0 =  179.

!     convert magnetic lat and long to radians

      blonr = blond * po180
      blatr = blatd * po180

!     position of point in geomagnetic coords
!     first get xm ym zm in the eccentric dipole system

      xm = brad *cos ( blatr ) * cos ( blonr )
      ym = brad *cos ( blatr ) * sin ( blonr )
      zm = brad *sin ( blatr )

!     calculate offset in geographic polar (p. 248 redbook)

      d = sqrt(x0**2 + y0**2 + z0**2)
      thd = acos( z0/d )
      phd = atan2( y0,x0 )

!     change to colatitude

      cotn = pie/2. - plat
      phin = plon

!     calculate offset in cartesian rotated system

      thp = acos(cos(cotn)*cos(thd)
     .      + sin(cotn)*sin(thd)*cos(phd-phin))
      cosphp = ( cos(cotn)*cos(thp) - cos(thd) )
     .         / (sin(cotn) * sin(thp))
      sinphp = sin(thd) * sin(phd-phin) / sin(thp)

      x0p = d*sin(thp)*cosphp
      y0p = d*sin(thp)*sinphp
      z0p = d*cos(thp)

!     next shift to the tilted dipole

      xmm = xm + x0p
      ymm = ym + y0p
      zmm = zm + z0p

!     r is invariant under the rotations of the tilted dipole

      grad = sqrt ( xmm ** 2 + ymm ** 2 + zmm ** 2 )

!     rotate coords in north-south direction

      xg =  xmm * sin ( plat ) + zmm * cos ( plat )
      yg =  ymm
      zg = -xmm * cos ( plat ) + zmm * sin ( plat )

!     geographic latitude and longitude converted to degrees

      glatd = asin ( zg / grad ) * rtod
      glond = ( plon + atan2 ( yg/grad,xg/grad ) ) * rtod

      if (glond .ge. 360) glond = glond-  360.

      return
      end

! *******************************************
! *******************************************

!             volume

! *******************************************
! *******************************************

        subroutine volume(x,y,z)

!       calculate cell volume
!       break each cell into
!       twelve tetrahedrons and use the formula:
!           V = (1/6) a . ( b x c )
!       where
!           a: vector from A to B
!           b: vector from A to C
!           c: vector from A to D
!       and node A is the 'midpoint' coordinate

        include 'param-0.98.inc'
        include 'com-0.98.inc'

        real x(nzp1,nfp1,2),y(nzp1,nfp1,2),z(nzp1,nfp1,2)
        real voli(nz,nf),volj(nz,nf),volk(nz,nf)

!       volume from sidei

        do k = 1,1
          do j = 1,nf
            do i = 1,nz

              xmid  = 0.5 * ( x(i,j,k) + x(i+1,j+1,k+1) )
              ymid  = 0.5 * ( y(i,j,k) + y(i+1,j+1,k+1) )
              zmid  = 0.5 * ( z(i,j,k) + z(i+1,j+1,k+1) )
              
              ax1 = x(i,j,k) - xmid
              ay1 = y(i,j,k) - ymid
              az1 = z(i,j,k) - zmid

              bx1 = x(i,j+1,k) - xmid
              by1 = y(i,j+1,k) - ymid
              bz1 = z(i,j+1,k) - zmid

              cx1 = x(i,j,k+1) - xmid
              cy1 = y(i,j,k+1) - ymid
              cz1 = z(i,j,k+1) - zmid

              dx1 =    by1 * cz1 - bz1 * cy1
              dy1 = -( bx1 * cz1 - bz1 * cx1 )
              dz1 =    bx1 * cy1 - by1 * cx1

              v1 = 0.166667 *
     .             abs(( ax1 * dx1 + ay1 * dy1 + az1 * dz1 ))

              ax2 = x(i,j+1,k+1) - xmid
              ay2 = y(i,j+1,k+1) - ymid
              az2 = z(i,j+1,k+1) - zmid

              v2 = 0.166667 *
     .             abs(( ax2 * dx1 + ay2 * dy1 + az2 * dz1 ))

              ax1 = x(i+1,j,k) - xmid
              ay1 = y(i+1,j,k) - ymid
              az1 = z(i+1,j,k) - zmid

              bx1 = x(i+1,j+1,k) - xmid
              by1 = y(i+1,j+1,k) - ymid
              bz1 = z(i+1,j+1,k) - zmid

              cx1 = x(i+1,j,k+1) - xmid
              cy1 = y(i+1,j,k+1) - ymid
              cz1 = z(i+1,j,k+1) - zmid

              dx1 =    by1 * cz1 - bz1 * cy1
              dy1 = -( bx1 * cz1 - bz1 * cx1 )
              dz1 =    bx1 * cy1 - by1 * cx1

              v3 = 0.166667 *
     .             abs(( ax1 * dx1 + ay1 * dy1 + az1 * dz1 ))
      
              ax2 = x(i+1,j+1,k+1) - xmid
              ay2 = y(i+1,j+1,k+1) - ymid
              az2 = z(i+1,j+1,k+1) - zmid

              v4 = 0.166667 *
     .             abs(( ax2 * dx1 + ay2 * dy1 + az2 * dz1 ))

              voli(i,j) = v1 + v2 + v3 + v4
               
            enddo
          enddo
        enddo

!       volume from sidej
 楼主| 发表于 2008-8-3 19:31 | 显示全部楼层

程序诊断【续】

!       volume from sidej

        do k = 1,1
          do j = 1,nf
            do i = 1,nz

              xmid = 0.5 * ( x(i,j,k) + x(i+1,j+1,k+1) )
              ymid = 0.5 * ( y(i,j,k) + y(i+1,j+1,k+1) )
              zmid = 0.5 * ( z(i,j,k) + z(i+1,j+1,k+1) )

              ax1 = x(i,j,k) - xmid
              ay1 = y(i,j,k) - ymid
              az1 = z(i,j,k) - zmid

              bx1 = x(i+1,j,k) - xmid
              by1 = y(i+1,j,k) - ymid
              bz1 = z(i+1,j,k) - zmid

              cx1 = x(i,j,k+1) - xmid
              cy1 = y(i,j,k+1) - ymid
              cz1 = z(i,j,k+1) - zmid

              dx1 =    by1 * cz1 - bz1 * cy1
              dy1 = -( bx1 * cz1 - bz1 * cx1 )
              dz1 =    bx1 * cy1 - by1 * cx1

              v1 = 0.166667 *
     .             abs(( ax1 * dx1 + ay1 * dy1 + az1 * dz1 ))

              ax2 = x(i+1,j,k+1) - xmid
              ay2 = y(i+1,j,k+1) - ymid
              az2 = z(i+1,j,k+1) - zmid

              v2 = 0.166667 *
     .             abs(( ax2 * dx1 + ay2 * dy1 + az2 * dz1 ))

              ax1 = x(i,j+1,k) - xmid
              ay1 = y(i,j+1,k) - ymid
              az1 = z(i,j+1,k) - zmid

              bx1 = x(i+1,j+1,k) - xmid
              by1 = y(i+1,j+1,k) - ymid
              bz1 = z(i+1,j+1,k) - zmid

              cx1 = x(i,j+1,k+1) - xmid
              cy1 = y(i,j+1,k+1) - ymid
              cz1 = z(i,j+1,k+1) - zmid

              dx1 =    by1 * cz1 - bz1 * cy1
              dy1 = -( bx1 * cz1 - bz1 * cx1 )
              dz1 =    bx1 * cy1 - by1 * cx1

              v3 = 0.166667 *
     .             abs(( ax1 * dx1 + ay1 * dy1 + az1 * dz1 ))
      
              ax2 = x(i+1,j+1,k+1) - xmid
              ay2 = y(i+1,j+1,k+1) - ymid
              az2 = z(i+1,j+1,k+1) - zmid

              v4 = 0.166667 *
     .             abs(( ax2 * dx1 + ay2 * dy1 + az2 * dz1 ))

              volj(i,j) = v1 + v2 + v3 + v4

            enddo
          enddo
        enddo

!       volume from sidek

        do k = 1,1
          do j = 1,nf
            do i = 1,nz

              xmid = 0.5 * ( x(i,j,k) + x(i+1,j+1,k+1) )
              ymid = 0.5 * ( y(i,j,k) + y(i+1,j+1,k+1) )
              zmid = 0.5 * ( z(i,j,k) + z(i+1,j+1,k+1) )

              ax1 = x(i,j,k) - xmid
              ay1 = y(i,j,k) - ymid
              az1 = z(i,j,k) - zmid

              bx1 = x(i+1,j,k) - xmid
              by1 = y(i+1,j,k) - ymid
              bz1 = z(i+1,j,k) - zmid

              cx1 = x(i,j+1,k) - xmid
              cy1 = y(i,j+1,k) - ymid
              cz1 = z(i,j+1,k) - zmid

              dx1 =    by1 * cz1 - bz1 * cy1
              dy1 = -( bx1 * cz1 - bz1 * cx1 )
              dz1 =    bx1 * cy1 - by1 * cx1

              v1 = 0.166667 *
     .             abs(( ax1 * dx1 + ay1 * dy1 + az1 * dz1 ))

              ax2 = x(i+1,j+1,k) - xmid
              ay2 = y(i+1,j+1,k) - ymid
              az2 = z(i+1,j+1,k) - zmid

              v2 = 0.166667 *
     .             abs(( ax2 * dx1 + ay2 * dy1 + az2 * dz1 ))

              ax1 = x(i,j,k+1) - xmid
              ay1 = y(i,j,k+1) - ymid
              az1 = z(i,j,k+1) - zmid

              bx1 = x(i+1,j,k+1) - xmid
              by1 = y(i+1,j,k+1) - ymid
              bz1 = z(i+1,j,k+1) - zmid

              cx1 = x(i,j+1,k+1) - xmid
              cy1 = y(i,j+1,k+1) - ymid
              cz1 = z(i,j+1,k+1) - zmid

              dx1 =    by1 * cz1 - bz1 * cy1
              dy1 = -( bx1 * cz1 - bz1 * cx1 )
              dz1 =    bx1 * cy1 - by1 * cx1

              v3 = 0.166667 *
     .             abs(( ax1 * dx1 + ay1 * dy1 + az1 * dz1 ))
      
              ax2 = x(i+1,j+1,k+1) - xmid
              ay2 = y(i+1,j+1,k+1) - ymid
              az2 = z(i+1,j+1,k+1) - zmid

              v4 = 0.166667 *
     .             abs(( ax2 * dx1 + ay2 * dy1 + az2 * dz1 ))

              volk(i,j) = v1 + v2 + v3 + v4

            enddo
          enddo
        enddo

        do j = 1,nf
          do i = 1,nz
            vol(i,j) = 1.e15 *
     .                 ( voli(i,j) + volj(i,j) + volk(i,j) )

          enddo
        enddo

        return
        end

! *******************************************
! *******************************************

!            area

! *******************************************
! *******************************************


        subroutine area(x,y,z)

!       calculate areas of cell sides
!       break each quadrilateral side into
!       two triangles and use the formula:
!           A = (1/2)|a x b|
!       where
!           a: vector from A to B
!           b: vector from A to C

        include 'param-0.98.inc'
        include 'com-0.98.inc'

        real x(nzp1,nfp1,2),y(nzp1,nfp1,2),z(nzp1,nfp1,2)

!       sidei (s-direction)

        do k = 1,1
          do j = 1,nf
            do i = 1,nzp1

              ax1 = x(i,j+1,k) - x(i,j,k)
              ay1 = y(i,j+1,k) - y(i,j,k)
              az1 = z(i,j+1,k) - z(i,j,k)

              bx1 = x(i,j,k+1) - x(i,j,k)
              by1 = y(i,j,k+1) - y(i,j,k)
              bz1 = z(i,j,k+1) - z(i,j,k)

              cx1 =    ay1 * bz1 - az1 * by1
              cy1 = -( ax1 * bz1 - az1 * bx1 )
              cz1 =    ax1 * by1 - ay1 * bx1

              a1 = 0.5 * sqrt ( cx1*cx1 + cy1*cy1 + cz1*cz1 )

              ax2 = x(i,j+1,k) - x(i,j+1,k+1)
              ay2 = y(i,j+1,k) - y(i,j+1,k+1)
              az2 = z(i,j+1,k) - z(i,j+1,k+1)

              bx2 = x(i,j,k+1) - x(i,j+1,k+1)
              by2 = y(i,j,k+1) - y(i,j+1,k+1)
              bz2 = z(i,j,k+1) - z(i,j+1,k+1)

              cx2 =    ay2 * bz2 - az2 * by2
              cy2 = -( ax2 * bz2 - az2 * bx2 )
              cz2 =    ax2 * by2 - ay2 * bx2

              a2 = 0.5 * sqrt ( cx2*cx2 + cy2*cy2 + cz2*cz2 )

              areas(i,j) = ( a1 + a2 ) * 1.e10

            enddo
          enddo
        enddo

!       sidej (p-direction)

        do k = 1,1
          do j = 1,nfp1
            do i = 1,nz

              ax1 = x(i+1,j,k) - x(i,j,k)
              ay1 = y(i+1,j,k) - y(i,j,k)
              az1 = z(i+1,j,k) - z(i,j,k)

              bx1 = x(i,j,k+1) - x(i,j,k)
              by1 = y(i,j,k+1) - y(i,j,k)
              bz1 = z(i,j,k+1) - z(i,j,k)

              cx1 =    ay1 * bz1 - az1 * by1
              cy1 = -( ax1 * bz1 - az1 * bx1 )
              cz1 =    ax1 * by1 - ay1 * bx1

              a1 = 0.5 * sqrt ( cx1*cx1 + cy1*cy1 + cz1*cz1 )
      
              ax2 = x(i+1,j,k) - x(i+1,j,k+1)
              ay2 = y(i+1,j,k) - y(i+1,j,k+1)
              az2 = z(i+1,j,k) - z(i+1,j,k+1)

              bx2 = x(i,j,k+1) - x(i+1,j,k+1)
              by2 = y(i,j,k+1) - y(i+1,j,k+1)
              bz2 = z(i,j,k+1) - z(i+1,j,k+1)

              cx2 =    ay2 * bz2 - az2 * by2
              cy2 = -( ax2 * bz2 - az2 * bx2 )
              cz2 =    ax2 * by2 - ay2 * bx2

              a2 = 0.5 * sqrt ( cx2*cx2 + cy2*cy2 + cz2*cz2 )
      
              areap(i,j) = ( a1 + a2 ) * 1.e10

            enddo
          enddo
        enddo

        return
        end

! *******************************************
! *******************************************

!            line

! *******************************************
! *******************************************


        subroutine line(x,y,z)

!       calculate length of cell sides

        include 'param-0.98.inc'
        include 'com-0.98.inc'

        real x(nzp1,nfp1,2),y(nzp1,nfp1,2),z(nzp1,nfp1,2)
        real xdelh(nzp1,nfp1)

!       xdels (s-direction)

        do k = 1,2
          do j = 1,nfp1
            do i = 1,nz

              ax1 = x(i+1,j,k) - x(i,j,k)
              ay1 = y(i+1,j,k) - y(i,j,k)
              az1 = z(i+1,j,k) - z(i,j,k)

              xdels(i,j,k) = sqrt ( ax1*ax1 + ay1*ay1 + az1*az1 )
     .                       * 1.e5

            enddo
          enddo
        enddo

!       xdelp (p-direction)

        do k = 1,2
          do j = 1,nf
            do i = 1,nzp1

              ax1 = x(i,j+1,k) - x(i,j,k)
              ay1 = y(i,j+1,k) - y(i,j,k)
              az1 = z(i,j+1,k) - z(i,j,k)

              xdelp(i,j,k) = sqrt ( ax1*ax1 + ay1*ay1 + az1*az1 )
     .                       * 1.e5

            enddo
          enddo
        enddo

!       xdelh (phi-direction)

          do j = 1,nfp1
            do i = 1,nzp1

              ax1 = x(i,j,2) - x(i,j,1)
              ay1 = y(i,j,2) - y(i,j,1)
              az1 = z(i,j,2) - z(i,j,1)

              xdelh(i,j) = sqrt ( ax1*ax1 + ay1*ay1 + az1*az1 )
     .                     * 1.e5

            enddo
          enddo

        return
        end

! *******************************************
! *******************************************

!            normal

! *******************************************
! *******************************************


        subroutine normal ( x,y,z )

!       calculate unit normal direction to cell face
!       normal: c = a x b / |a x b|

        include 'param-0.98.inc'
        include 'com-0.98.inc'

        real x(nzp1,nfp1,2),y(nzp1,nfp1,2),z(nzp1,nfp1,2)

!       norms (normal to cell face in s-direction)

        do j = 1,nf
          do i = 1,nzp1
            
            ax1 = x(i,j+1,2) - x(i,j,1)
            ay1 = y(i,j+1,2) - y(i,j,1)
            az1 = z(i,j+1,2) - z(i,j,1)

            bx1 = x(i,j,2) - x(i,j+1,1)
            by1 = y(i,j,2) - y(i,j+1,1)
            bz1 = z(i,j,2) - z(i,j+1,1)

            cx1 =   ay1 * bz1 - az1 * by1
            cy1 = -(ax1 * bz1 - az1 * bx1)
            cz1 =   ax1 * by1 - ay1 * bx1

            ca1 = sqrt( cx1*cx1 + cy1*cy1 + cz1*cz1 )

            xnorms(i,j) = cx1/ca1
            ynorms(i,j) = cy1/ca1
            znorms(i,j) = cz1/ca1

          enddo
        enddo

!       normp (normal to cell face in p-direction)

        do j = 1,nfp1
          do i = 1,nz
            
            ax1 = x(i,j,2) - x(i+1,j,1)
            ay1 = y(i,j,2) - y(i+1,j,1)
            az1 = z(i,j,2) - z(i+1,j,1)

            bx1 = x(i+1,j,2) - x(i,j,1)
            by1 = y(i+1,j,2) - y(i,j,1)
            bz1 = z(i+1,j,2) - z(i,j,1)

            cx1 =   ay1 * bz1 - az1 * by1
            cy1 = -(ax1 * bz1 - az1 * bx1)
            cz1 =   ax1 * by1 - ay1 * bx1

            ca1 = sqrt( cx1*cx1 + cy1*cy1 + cz1*cz1 )

            xnormp(i,j) = cx1/ca1
            ynormp(i,j) = cy1/ca1
            znormp(i,j) = cz1/ca1

          enddo
        enddo

!       norml (normal to cell face in phi-direction: longitude)

!        do j = 1,nf
!          do i = 1,nzp1
            
!            ax1 = x(i+1,j+1,1) - x(i,j,1)
!            ay1 = y(i+1,j+1,1) - y(i,j,1)
!            az1 = z(i+1,j+1,1) - z(i,j,1)

!            bx1 = x(i,j+1,1) - x(i+1,j,1)
!            by1 = y(i,j+1,1) - y(i+1,j,1)
!            bz1 = z(i,j+1,1) - z(i+1,j,1)

!            cx1 =   ay1 * bz1 - az1 * by1
!            cy1 = -(ax1 * bz1 - az1 * bx1)
!            cz1 =   ax1 * by1 - ay1 * bx1

!            ca1 = sqrt( cx1*cx1 + cy1*cy1 + cz1*cz1 )

!            xnorml(i,j) = cx1/ca1
!            ynorml(i,j) = cy1/ca1
!            znorml(i,j) = cz1/ca1

!          enddo
!        enddo

        return
        end

! *******************************************
! *******************************************

!            vnormal

!*******************************************
!*******************************************


      subroutine vnormal ( qs,blon0,brs )

!     calculate e x b velocity direction
!     change p but keep q constant

      include 'param-0.98.inc'
      include 'com-0.98.inc'

      real qs(nz,nf),qss(nzp1,nf),pss(nzp1,nf)
      real brs1(nzp1,nf),blats1(nzp1,nf)
      real brs2(nzp1,nf),blats2(nzp1,nf)
      real xs1(nzp1,nf),ys1(nzp1,nf),zs1(nzp1,nf)
      real xs2(nzp1,nf),ys2(nzp1,nf),zs2(nzp1,nf)
      real brs(nz,nf)

!      open (unit=12, file='xs1.dat')
!      open (unit=13, file='ys1.dat')
!      open (unit=15, file='xs2.dat')
!      open (unit=16, file='ys2.dat')

      delps = .001

      do j = 1,nf
        do i = 1,nz-1
          qss(i+1,j) = 0.5 * ( qs(i,j) + qs(i+1,j) )
        enddo
        qss(1,j)    = qs(1,j)  + 0.5 * ( qs(1,j) - qs(2,j) )
        qss(nzp1,j) = qs(nz,j) + 0.5 * ( qs(nz,j) - qs(nz-1,j) )
      enddo

      do j = 1,nf
        do i = 1,nz
          pss(i+1,j) = ps(i,j)
        enddo
      enddo
      do j = 1,nf
        pss(1,j) = pss(2,j)
      enddo

      do j = 1,nf
        do i = 1,nz+1

!         grid 1 (at pss(i,j))

          qtmp   = qss(i,j)
          pvalue = pss(i,j)
          r = re*qp_solve(qtmp,pvalue)
         
          brs1(i,j)      = r
          br_norm        = r / re
          blats1(i,j)    = asin ( qss(i,j) * br_norm ** 2 ) * rtod

          xs1(i,j)    = brs1(i,j) * cos( blats1(i,j)*po180 ) *
     .                              sin( blon0      * po180 )
          ys1(i,j)    = brs1(i,j) * sin( blats1(i,j)*po180 )
          zs1(i,j)    = brs1(i,j) * cos( blats1(i,j) * po180 ) *
     .                              cos( blon0      * po180 )

!         grid 2 (at pss(i,j)+delps)

          qtmp   = qss(i,j)
          pvalue = pss(i,j) + delps
          r = re*qp_solve(qtmp,pvalue)
         
          brs2(i,j)      = r
          br_norm        = r / re
          blats2(i,j)    = asin ( qss(i,j) * br_norm ** 2 ) * rtod

!         grid in cartesian coordinates

          xs2(i,j)    = brs2(i,j) * cos( blats2(i,j)*po180 ) *
     .                              sin( blon0      * po180 )
          ys2(i,j)    = brs2(i,j) * sin( blats2(i,j)*po180 )
          zs2(i,j)    = brs2(i,j) * cos( blats2(i,j) * po180 ) *
     .                              cos( blon0       * po180 )

        enddo
      enddo

!     direction of e x b velocity

      do j = 1,nf
        do i = 1,nzp1
          ax1 = xs2(i,j) - xs1(i,j)
          ay1 = ys2(i,j) - ys1(i,j)
          az1 = zs2(i,j) - zs1(i,j)
          a1  = sqrt ( ax1*ax1 + ay1*ay1 + az1*az1 )
          vnx(i,j) = ax1 / a1
          vny(i,j) = ay1 / a1
          vnz(i,j) = az1 / a1
        enddo
      enddo

      do i = 1,nzp1
        vnx(i,nfp1) = vnx(i,nf)
        vny(i,nfp1) = vny(i,nf)
        vnz(i,nfp1) = vnz(i,nf)
      enddo
      

      return
      end


! ********************************************************

        function qp_solve(q,p)

        real qp_solve,q,p
        real term1,term2

!       MS: Functionally unnecessary, but kind of neat.  To get r from
!       (q,p) one needs to find the root of a fourth-order polynomial.
!       The code did this with a standard root-finding method,
!       but, of course, there is a closed-form solution.  Since the
!       polynomial has no second or third order terms, the answer
!       isn't completely ugly, and the code below gives the exact
!       result.  Note the special case for q = 0, i.e. points on
!       the magnetic equator.
  
!        if (p .eq. 0.) then
!          print *,'p = 0 in qp_solve'
!          stop
!        endif

!        if (q .eq. 0.) then
!          qp_solve = p
!        else
!        term1 = ( (sqrt(27.) + sqrt(27.+256.*q**2*p**4)) /
!     .             (16.*abs(q)*p**2) ) ** (1./3.)
!        term2 = 2./(abs(q)*sqrt(3.)) * (term1 - 1./term1)
!        qp_solve = 0.5*sqrt(term2)*(sqrt(2./(p*q**2*sqrt(term2**3)) -
!     .                       1.) - 1.)
!      endif


! MS: The formula is actually my third attempt.  The first had huge
! cancellation problems when q was small, the second had smaller
! problems when term0 was large. This should be well-behaved
! everywhere.  Massive algebra was involved along the way.

        term0 = 256./27.*q**2*p**4
        term1 = ( 1. + sqrt(1. + term0) )**(2./3.)
        term2 = term0**(1./3.)
        term3 = 0.5 * ( (term1**2 + term1*term2 +
     .                term2**2)/term1 )**(3./2.)
        qp_solve = p * (4.*term3) / (1.+term3) /
     .                 ( 1.+sqrt(2.*term3-1.) )


        end

!    IGRF_SUB.F
!    contributed by Paul Bernhardt (NRL)

       subroutine igrf_sub(phi0)

       include 'param-0.98.inc'
       include 'com-0.98.inc'

       phi = phi0 * pie / 180.

       x0  = -353.8674146847993 -
     .        80.0112901196596*Cos(phi) +
     .        165.9453553374371*Cos(2*phi) +
     .        96.90976911496519*Cos(3*phi) -
     .        41.234237919645906*Cos(4*phi) -
     .        5.647625148538237*Cos(5*phi) +
     .        29.81898130515779*Cos(6*phi) +
     .        27.310156089558348*Cos(7*phi) +
     .        7.017930973481185*Cos(8*phi) -
     .        7.511889133487608*Cos(9*phi) -
     .        6.720946815524082*Cos(10*phi) -
     .        0.5967604884638268*Cos(11*phi) +
     .        3.9340250001598633*Cos(12*phi) +
     .        3.232375199053169*Cos(13*phi) +
     .        0.1418342157838855*Cos(14*phi) -
     .        1.7399223106946722*Cos(15*phi) -
     .        1.2396197007828484*Cos(16*phi) +
     .        0.24319862206273882*Cos(17*phi) +
     .        1.0043588925588962*Cos(18*phi) +
     .        0.6050359806604826*Cos(19*phi) -
     .        0.2175679881607454*Cos(20*phi) -
     .        0.5970638247030868*Cos(21*phi) -
     .        0.3095886741276035*Cos(22*phi) +
     .        0.24106351981877516*Cos(23*phi) -
     .        39.488705071918595*Sin(phi) -
     .        35.12750391544765*Sin(2*phi) -
     .        52.61217403191678*Sin(3*phi) +
     .        35.372208218215505*Sin(4*phi) +
     .        62.517949955768565*Sin(5*phi) +
     .        33.70515829546757*Sin(6*phi) -
     .        6.367067330825964*Sin(7*phi) -
     .        16.84168815021257*Sin(8*phi) -
     .        8.77073458124951*Sin(9*phi) +
     .        2.4509417362535326*Sin(10*phi) +
     .        5.964643505586716*Sin(11*phi) +
     .        2.7430884455100206*Sin(12*phi) -
     .        1.469044512466587*Sin(13*phi) -
     .        2.58647152886297*Sin(14*phi) -
     .        0.9057773601920639*Sin(15*phi) +
     .        0.9500051070510113*Sin(16*phi) +
     .        1.2595308671288294*Sin(17*phi) +
     .        0.30670958561561906*Sin(18*phi) -
     .        0.6041955011153372*Sin(19*phi) -
     .        0.669980882605414*Sin(20*phi) -
     .        0.08600912796198656*Sin(21*phi) +
     .        0.4475307568863845*Sin(22*phi) +
     .        0.4538479001719651*Sin(23*phi)



       y0 = 357.71572803711445 +
     .      179.10000315892776*Cos(phi) +
     .      0.48625012094252057*Cos(2*phi) -
     .      18.222451520290683*Cos(3*phi) -
     .      74.19071886155683*Cos(4*phi) -
     .      36.523066435387676*Cos(5*phi) -
     .      1.3391741086911595*Cos(6*phi) +
     .      21.128815605008093*Cos(7*phi) +
     .      12.30309152643703*Cos(8*phi) +
     .      0.7072007210810681*Cos(9*phi) -
     .      4.253716697410791*Cos(10*phi) -
     .      1.9043150223068182*Cos(11*phi) +
     .      1.5369582665526593*Cos(12*phi) +
     .      2.322273352128386*Cos(13*phi) +
     .      0.8660859526717453*Cos(14*phi) -
     .      0.6517850740970705*Cos(15*phi) -
     .      0.8233191201701169*Cos(16*phi) -
     .      0.06587490166894897*Cos(17*phi) +
     .      0.5590511561227545*Cos(18*phi) +
     .      0.4857427492770479*Cos(19*phi) +
     .      0.003220351289183923*Cos(20*phi) -
     .      0.31210096865413983*Cos(21*phi) -
     .      0.19887427994494658*Cos(22*phi) +
     .      0.13672910587356485*Cos(23*phi) +
     .      416.65605532707093*Sin(phi) +
     .      97.64092937463448*Sin(2*phi) +
     .      89.90576641057676*Sin(3*phi) +
     .      19.563789031651595*Sin(4*phi) +
     .      46.61385007838707*Sin(5*phi) +
     .      46.23624804545088*Sin(6*phi) +
     .      19.328984217463248*Sin(7*phi) +
     .      2.4598324280936414*Sin(8*phi) -
     .      3.4043388007500432*Sin(9*phi) +
     .      2.111663037458501*Sin(10*phi) +
     .      4.723429973505645*Sin(11*phi) +
     .      3.7939791153184026*Sin(12*phi) +
     .      0.783837405015646*Sin(13*phi) -
     .      0.8951808216876126*Sin(14*phi) -
     .      0.5853291438883146*Sin(15*phi) +
     .      0.49374732010654354*Sin(16*phi) +
     .      0.9299824387332063*Sin(17*phi) +
     .      0.48650275322307124*Sin(18*phi) -
     .      0.15694935678709498*Sin(19*phi) -
     .      0.36063573138052973*Sin(20*phi) -
     .      0.08389592287106021*Sin(21*phi) +
     .      0.25573941044924925*Sin(22*phi) +
     .      0.2852013162673946*Sin(23*phi)
 楼主| 发表于 2008-8-3 19:33 | 显示全部楼层

诊断程序【续】

z0 = 250.43165707492653 +
     .      340.66122483264905*Cos(phi) +
     .      69.95634836232071*Cos(2*phi) +
     .      44.71168620310048*Cos(3*phi) +
     .      5.572752558766106*Cos(4*phi) -
     .      1.4339461502279616*Cos(5*phi) -
     .      3.217930812956232*Cos(6*phi) -
     .      1.7751137903566045*Cos(7*phi) -
     .      1.5857495900135135*Cos(8*phi) -
     .      0.7461261912547706*Cos(9*phi) +
     .      0.14563859321432496*Cos(10*phi) +
     .      0.3315895855881013*Cos(11*phi) +
     .      0.11379367536280918*Cos(12*phi) -
     .      0.15395572288202422*Cos(13*phi) -
     .      0.19461671510187845*Cos(14*phi) -
     .      0.06361599694133094*Cos(15*phi) +
     .      0.055766203925038796*Cos(16*phi) +
     .      0.06413644582150604*Cos(17*phi) +
     .      0.0016750432363388439*Cos(18*phi) -
     .      0.04182349014199574*Cos(19*phi) -
     .      0.031182905113287293*Cos(20*phi) +
     .      0.001753974707015248*Cos(21*phi) +
     .      0.013973913699992777*Cos(22*phi) +
     .      0.001281301856688131*Cos(23*phi) -
     .      30.176529635127274*Sin(phi) +
     .      3.4340205951414946*Sin(2*phi) -
     .      6.8123984277392795*Sin(3*phi) -
     .      11.668750059562694*Sin(4*phi) -
     .      0.5810580595917775*Sin(5*phi) -
     .      1.5870410791195877*Sin(6*phi) -
     .      1.5244529990716116*Sin(7*phi) -
     .      0.559954677080775*Sin(8*phi) +
     .      0.5194385178951049*Sin(9*phi) +
     .      0.415495066076052*Sin(10*phi) +
     .      0.04521386570333395*Sin(11*phi) -
     .      0.24535417687477926*Sin(12*phi) -
     .      0.18203325048713365*Sin(13*phi) +
     .      0.018878146825439902*Sin(14*phi) +
     .      0.12360222004213386*Sin(15*phi) +
     .      0.07257334462042853*Sin(16*phi) -
     .      0.022737330338338836*Sin(17*phi) -
     .      0.05776054926047047*Sin(18*phi) -
     .      0.023788034168565193*Sin(19*phi) +
     .      0.018325492914075404*Sin(20*phi) +
     .      0.02376235757596904*Sin(21*phi) +
     .      0.002628561346701197*Sin(22*phi) -
     .      0.00943276960175865*Sin(23*phi)

       b0 = 29229.88363541812 -
     .      1115.0281463875144*Cos(phi) +
     .      211.9965588481871*Cos(2*phi) -
     .      145.87863848381699*Cos(3*phi) -
     .      185.94991131071188*Cos(4*phi) -
     .      94.76388090038132*Cos(5*phi) -
     .      21.781240606511467*Cos(6*phi) +
     .      10.608481026851262*Cos(7*phi) +
     .      26.445003680471622*Cos(8*phi) +
     .      9.033803335738316*Cos(9*phi) -
     .      5.121597505263254*Cos(10*phi) -
     .      8.699077903900074*Cos(11*phi) -
     .      2.3758078601113084*Cos(12*phi) +
     .      3.003659043878612*Cos(13*phi) +
     .      3.3447365817081867*Cos(14*phi) +
     .      0.46321746934859276*Cos(15*phi) -
     .      1.6640994428565439*Cos(16*phi) -
     .      1.3856408382560013*Cos(17*phi) +
     .      0.06865975473204816*Cos(18*phi) +
     .      0.8650543900984624*Cos(19*phi) +
     .      0.4841643209453366*Cos(20*phi) -
     .      0.22968004188392457*Cos(21*phi) -
     .      0.38869426768468657*Cos(22*phi) -
     .      0.00489072283424378*Cos(23*phi) -
     .      343.1161166643772*Sin(phi) -
     .      214.46870730780248*Sin(2*phi) -
     .      218.4373355152967*Sin(3*phi) -
     .      139.32266779124643*Sin(4*phi) -
     .      40.479773535930704*Sin(5*phi) +
     .      21.102185585291537*Sin(6*phi) +
     .      27.763390345914974*Sin(7*phi) +
     .      1.6622501124443485*Sin(8*phi) -
     .      13.49400563169258*Sin(9*phi) -
     .      10.573966878144494*Sin(10*phi) +
     .      0.0010493967978287462*Sin(11*phi) +
     .      5.211690149433707*Sin(12*phi) +
     .      3.1952678133195556*Sin(13*phi) -
     .      1.1454324071564117*Sin(14*phi) -
     .      2.728164501523932*Sin(15*phi) -
     .      1.2850993411366254*Sin(16*phi) +
     .      0.7013933219589532*Sin(17*phi) +
     .      1.1699781168734327*Sin(18*phi) +
     .      0.301352221634545*Sin(19*phi) -
     .      0.5291265885714342*Sin(20*phi) -
     .      0.49114080833339335*Sin(21*phi) +
     .      0.050614256681022596*Sin(22*phi) +
     .      0.28881769341899144*Sin(23*phi)

       thn = 0.19622243171731607 -
     .      0.006649098360752184*Cos(phi) -
     .      0.01956517122663376*Cos(2*phi) -
     .      0.008660216931195966*Cos(3*phi) -
     .      0.006137819025589696*Cos(4*phi) -
     .      0.0075964729910884795*Cos(5*phi) -
     .      0.0016461860924103853*Cos(6*phi) +
     .      0.0007294454409291066*Cos(7*phi) +
     .      0.0023685663829071343*Cos(8*phi) +
     .      0.0003889280477075606*Cos(9*phi) -
     .      0.0006979450055063492*Cos(10*phi) -
     .      0.000885537681495029*Cos(11*phi) -
     .      0.00014878907992479928*Cos(12*phi) +
     .      0.0003679941251949079*Cos(13*phi) +
     .      0.0003130319474168302*Cos(14*phi) -
     .      0.000016633051122379423*Cos(15*phi) -
     .      0.00020931570552896087*Cos(16*phi) -
     .      0.0001303595920774504*Cos(17*phi) +
     .      0.0000388948168387536*Cos(18*phi) +
     .      0.00010454833096758408*Cos(19*phi) +
     .      0.00003792479727719437*Cos(20*phi) -
     .      0.00004613565179395065*Cos(21*phi) -
     .      0.00005090440921535995*Cos(22*phi) +
     .      7.923475578463114e-6*Cos(23*phi) -
     .      0.05678320125406135*Sin(phi) -
     .      0.023022365710781457*Sin(2*phi) -
     .      0.018030195256608213*Sin(3*phi) -
     .      0.013827655583181043*Sin(4*phi) -
     .      0.0061990077703202836*Sin(5*phi) +
     .      0.0017061925607212282*Sin(6*phi) +
     .      0.0023352555360747727*Sin(7*phi) -
     .      0.0002812394123411336*Sin(8*phi) -
     .      0.0014632759741499833*Sin(9*phi) -
     .      0.0009892215014679607*Sin(10*phi) +
     .      0.00012383435618247*Sin(11*phi) +
     .      0.0005411721277811578*Sin(12*phi) +
     .      0.00024600375235788244*Sin(13*phi) -
     .      0.0002043069395354885*Sin(14*phi) -
     .      0.0003033173283262694*Sin(15*phi) -
     .      0.00010053028847115513*Sin(16*phi) +
     .      0.0001067032704224899*Sin(17*phi) +
     .      0.00012248942798267554*Sin(18*phi) +
     .      5.7013723087397106e-6*Sin(19*phi) -
     .      0.00007782884382598787*Sin(20*phi) -
     .      0.0000523747335689761*Sin(21*phi) +
     .      0.000021462140784394788*Sin(22*phi) +
     .      0.00004552716184377109*Sin(23*phi)

       phn = -1.1840115989900575 -
     .      0.2501052377367187*Cos(phi) -
     .      0.0870108497349657*Cos(2*phi) +
     .      0.05524474825558274*Cos(3*phi) +
     .      0.06571634574967282*Cos(4*phi) +
     .      0.054497177647939085*Cos(5*phi) -
     .      0.010914652319742967*Cos(6*phi) -
     .      0.017494764756306118*Cos(7*phi) -
     .      0.001677474136905055*Cos(8*phi) +
     .      0.009094152785717784*Cos(9*phi) +
     .      0.00778609301072576*Cos(10*phi) -
     .      0.000017569943641948104*Cos(11*phi) -
     .      0.00427665106371633*Cos(12*phi) -
     .      0.0031248120532568428*Cos(13*phi) +
     .      0.0004018612433600332*Cos(14*phi) +
     .      0.002025672163296362*Cos(15*phi) +
     .      0.001115968407376618*Cos(16*phi) -
     .      0.0005287555269570307*Cos(17*phi) -
     .      0.0011232678915695546*Cos(18*phi) -
     .      0.0005000380314326315*Cos(19*phi) +
     .      0.00036696679782018067*Cos(20*phi) +
     .      0.000649640645505565*Cos(21*phi) +
     .      0.0002778176080716778*Cos(22*phi) -
     .      0.0002750904248179207*Cos(23*phi) +
     .      0.03756894419604881*Sin(phi) -
     .      0.005007302851653333*Sin(2*phi) +
     .      0.09805567331135825*Sin(3*phi) -
     .      0.015507188585201165*Sin(4*phi) -
     .      0.05239031186985234*Sin(5*phi) -
     .      0.01826942178430312*Sin(6*phi) +
     .      0.0022905823113473396*Sin(7*phi) +
     .      0.018062815520885563*Sin(8*phi) +
     .      0.00816576532607775*Sin(9*phi) -
     .      0.0018070882685123845*Sin(10*phi) -
     .      0.005789120556186378*Sin(11*phi) -
     .      0.0018598667086740701*Sin(12*phi) +
     .      0.0023061252186550446*Sin(13*phi) +
     .      0.002787011388680176*Sin(14*phi) +
     .      0.0006208190253855384*Sin(15*phi) -
     .      0.001298615463680044*Sin(16*phi) -
     .      0.0012840198090914765*Sin(17*phi) -
     .      0.00011250361770319753*Sin(18*phi) +
     .      0.00076532973526117*Sin(19*phi) +
     .      0.0006628511134355898*Sin(20*phi) -
     .      6.212956128694389e-6*Sin(21*phi) -
     .      0.000505326773031062*Sin(22*phi) -
     .      0.0004597641346084901*Sin(23*phi)

         b0 = 1.e-5 * b0 ! convert to gauss

!         print *,'phi0,x0,y0,z0,thn,phn,b0',phi0,x0,y0,z0,thn,phn,b0

       plat = 0.5 * pie - thn
       plon = 2. * pie + phn

       return
       end

! *************************************************

!            vector

! MS 9/15/05
! This subroutine finds the coefficients needed to calculate the   
! parallel components of vectors.  The math is shamelessly copied from   
! the CTIP paper in the red book.  Inputs are the magnetic coordinates
! of a point, outputs are the coefficients at that point.

      subroutine vector(brad,blond,blatd,varg,vathg,vaphig)

      include 'param-0.98.inc'
      include 'com-0.98.inc'

      real brad,blond,blatd,blonr,grad,glat,glon
      real thetaprime,cosphiprime,sinphiprime
      real sinomega,cosomega,coplat,theta
      real arm,athm,aphim,ax,ay,az,arp,athp,aphip,varg,vathg,vaphig

!     Convert blatd and plat to colatitude, blon to radians

      theta  = pie/2. - blatd*po180
      coplat = pie/2. - plat
      blonr  = blond*po180

      arm = 2.* cos (theta) /  sqrt ( ( 2. * cos(theta) ) ** 2 +  
     .        sin(theta)   ** 2 )
      athm =     sin (theta) / sqrt ( ( 2. * cos(theta) ) ** 2 +
     .        sin(theta)   ** 2 )
       aphim = 0.

      ax = arm * sin(theta)*cos(blonr) + athm*cos(theta)*cos(blonr)
      ay = arm * sin(theta)*sin(blonr) + athm*cos(theta)*sin(blonr)
      az = arm * cos(theta) - athm*sin(theta)

!     Find geographic coordinates of point

      call btog(brad,blond,blatd,grad,glat,glon)
      glat = pie/2. - glat*po180
      glon = glon * po180

!     See p.243 of red book

      thetaprime = acos(cos(coplat)*cos(glat) +
     .             sin(coplat)*sin(glat)*cos(glon-plon))

!     Account for possibility of no tilt.

      if (coplat .eq. 0.) then
        cosphiprime = 1.
        sinphiprime = 0.
      else
        cosphiprime = ( cos(coplat)*cos(thetaprime) - cos(glat) ) /
     .              (sin(coplat) * sin(thetaprime))
        sinphiprime = sin(glat) * sin(glon-plon) / sin(thetaprime)
      endif

      arp = ax * sin(thetaprime)*cosphiprime +
     .      ay*sin(thetaprime)*sinphiprime +
     .      az*cos(thetaprime)
      athp = ax * cos(thetaprime)*cosphiprime +
     .        ay*cos(thetaprime)*sinphiprime -
     .        az*sin(thetaprime)
      aphip = -ax*sinphiprime + ay*cosphiprime

      sinomega = -sin(coplat)*sin(glon - plon) / sin(thetaprime)

!     MS: This formula is wrong in the red book.  Corrected here.

      cosomega = (cos(coplat) - cos(glat)*cos(thetaprime)) /
     .           (sin(thetaprime) * sin(glat))

      varg  = arp
      vathg = athp*cosomega + aphip*sinomega

!     Because of a typographical error this formula does not appear in
!     the red book.

      vaphig = -athp*sinomega + aphip*cosomega

      return
      end
 楼主| 发表于 2008-8-3 19:36 | 显示全部楼层
下面分别是程序开始时候的两个include 的内容:
*******************************************
*******************************************

!            PARAM-0.98.INC

*******************************************
*******************************************

!      number of altitudes

       parameter ( nf   = 3,
     .             nfp1 = nf + 1,
     .             nfm1 = nf - 1,
     .             nfm2 = nf - 2  )

!      number of grid cells
     
       parameter ( nz = 101,
     .             nzp1 = nz + 1,
     .             nzm1 = nz - 1  )

!      ion densities

       integer nion,pthp,pthep,ptnp,ptop,ptn2p,ptnop,pto2p

       parameter ( nion  = 7 )   ! number of ions
       parameter ( pthp  = 1 )   ! h+
       parameter ( pthep = 5 )   ! he+
       parameter ( ptnp  = 7 )   ! n+
       parameter ( ptop  = 2 )   ! o+
       parameter ( ptn2p = 6 )   ! n2+
       parameter ( ptnop = 3 )   ! no+
       parameter ( pto2p = 4 )   ! o2+

!      neutrals

       integer nneut,pth,pthe,ptn,pto,ptn2,ptno,pto2

       parameter ( nneut = 7 )   ! number of neutrals
       parameter ( pth   = 1 )   ! h
       parameter ( pthe  = 5 )   ! he
       parameter ( ptn   = 7 )   ! n
       parameter ( pto   = 2 )   ! o
       parameter ( ptn2  = 6 )   ! n2
       parameter ( ptno  = 3 )   ! no
       parameter ( pto2  = 4 )   ! o2

!      number of chemical reactions

       parameter ( nchem = 21 )

!      various constants

!      ftnchek is giving some meaningless errors about precision,
!      but i am going to lower the precision of some of these
!      variables to keep down the error messages


       parameter ( pie    = 3.1415927   )
       parameter ( po180  = 1.745329e-02 )
       parameter ( rtod   = 57.295780    )
       parameter ( tm18   = 1.e-18       )

       parameter ( spday  = 86400., sphr = 3600.   )

       parameter ( gzero  = 980.665, re = 6370., bmag = 0.25 )  

       parameter ( bolt   = 1.38044e-16 )
       parameter ( amu    = 1.67252e-24 )
       parameter ( evtok  = 1.1604e+04  )

       parameter ( linesuv = 37, linesnt = 4 )

       parameter ( dayve = 80., sidyr = 365.4, solinc = 23.5 )

!      these are for the error function

       parameter ( pas =   .3275911, z1 =  .2548295,
     .             z2  = - .284496 , z3 = 1.421413,
     .             z4  = -1.453152 , z5 = 1.0614054  )




*******************************************
*******************************************

!            COM-0.98.INC

*******************************************
*******************************************

!     namelist data

      logical fejer,fmtout
      real snn(nneut)

      common / nmlst / fmtout,maxstep,hrmax,dt0,dthr,hrpr,
     .                 grad_in,glat_in,glon_in,
     .                 fejer,
     .                 rmin,rmax,
     .                 altmin,
     .                 fbar,f10p7,ap,
     .                 year,day,mmass,
     .                 nion1,nion2,hrinit,tvn0,tvexb0,ve01,
     .                 gams,gamp,snn,stn,denmin,alt_crit,cqe


!     s grid data

      real alts(nz,nf),grs(nz,nf),glats(nz,nf),glons(nz,nf)
      real bms(nz,nf),gs(nz),ps(nz,nf),blats(nz,nf)
      real coschicrit(nz,nf)
      real ds(nz,nf),d2s(nz,nf),d22s(nz,nf)
      real dels(nz,nf)
      integer iz300s(nf),iz300n(nf)
      real grad_inp (nf)
      real xnorms(nzp1,nf),ynorms(nzp1,nf),znorms(nzp1,nf)
      real xnormp(nz,nfp1),ynormp(nz,nfp1),znormp(nz,nfp1)
      real arg(nz,nf),athg(nz,nf),aphig(nz,nf)

      common / sgrid / alts,grs,glats,glons,
     .                 bms,gs,ps,blats,
     .                 ds,d2s,d22s,
     .                 dels,
     .                 iz300s,iz300n,grad_inp,
     .                 xnorms,ynorms,znorms,
     .                 xnormp,ynormp,znormp,coschicrit,
     .                 arg,athg,aphig

!       alts     altitude  (in km) on s mesh
!       grs      radial geographic distance to field line on s mesh
!       glats    geographic latitude on s mesh
!       glons    geographic longitude on s mesh
!       bms      normalized magnetic field on s mesh (b/b0)
!       ds,d2,
!       d22s     differential `distances' used in diff eqs
!       dels     actual arc length of grid in s direction
!       iz300s   index of grid at 300 km in south
!       iz300n   index of grid at 300 km in north

!     p grid data

      real delsp(nz,nfp1),vol(nz,nf)
      real areap(nz,nfp1),areas(nzp1,nf)
      real vnx(nzp1,nfp1),vny(nzp1,nfp1),vnz(nzp1,nfp1)
      real xdels(nz,nfp1,2),xdelp(nzp1,nf,2)
      real vexbs(nzp1,nf),vexbp(nz,nfp1),vexb(nzp1,nfp1)

      common / pgrid / delsp,vol,
     .                 areap,areas,
     .                 vnx,vny,vnz,
     .                 xdels,xdelp,
     .                 vexbs,vexbp,vexb

!     delsp      actual arc length of grid in s direction on p grid
!     vol        volume (i.e., area) of cell

!     chemical reaction data

      integer ichem(nchem,3)
      real ireact(nion,nneut,nchem)

      common / chem / ichem,ireact

!     variables

      real deni(nz,nf,nion),denn(nz,nf,nneut),ne(nz,nf)
      real vsi(nz,nf,nion),vsid(nz,nf,nion)
      real sumvsi(nz,nf,nion),vsic(nz,nf,nion)
      real te(nz,nf),ti(nz,nf,nion),tn(nz,nf)
      real u(nz,nf),v(nz,nf),vpi(nz,nf)

      common / var / deni,denn,ne,te,ti,tn,u,v,vsi,vsid
     .              ,sumvsi,vpi,vsic,ftc,dt

!     velocity in radial (vor) and theta (vot) directions

      real vot(nz,nf,nion),vor(nz,nf,nion)

      common / dvel / vot,vor

!     atomic masses

      real ami(nion),amn(nneut),alpha0(nneut),aap(7)

      common / atm / ami,amn,alpha0,aap

!     zenith datt

      real cx(nz,nf)

      common / geom / cx

!     photodeposition rates
!     used 3 (absorption) and 7 (nion) explicitly
!     used 4 (number of angles in nighttime deposition)

      real sigabsdt(linesuv,3),flux(linesuv),sigidt(linesuv,7)
      real sigint(linesnt,7),fluxnt(nz,nf,91,linesnt)
      real thetant(linesnt,4),zaltnt(linesnt,2)

      common / photdep / sigabsdt,flux,sigidt,
     .                   sigint,fluxnt,thetant,zaltnt

!     diagnostic variables

      real t1(nz,nf,nion),t2(nz,nf,nion),t3(nz,nf,nion)
      real u1(nz,nf),u2(nz,nf),u3(nz,nf),u4(nz,nf),u5(nz,nf)

      common / diag / t1,t2,t3,u1,u2,u3,u4,u5

      real x0,y0,z0,plat,plon,b0
      common / igrfstuff / x0,y0,z0,plat,plon,b0
 楼主| 发表于 2008-8-3 19:38 | 显示全部楼层
对所有在这方面的高手表示感谢!!!!
发表于 2008-8-10 10:48 | 显示全部楼层
先说说你的编译环境吧,估计是库文件版本不匹配造成的
 楼主| 发表于 2008-8-18 10:19 | 显示全部楼层
无论如何,谢谢风花雪月!
虽然现在我还没有搞明白错在哪里······
发表于 2008-8-18 21:54 | 显示全部楼层
问题解决了吗?
没有解决的话我建议把你的程序打个包,上传,以便于别人帮你编译,看看错误。
现在上载的方式不利于别人试,很容易弄错。
发表于 2008-8-21 10:24 | 显示全部楼层
发表于 2008-8-21 10:24 | 显示全部楼层
原帖由 weiwei43 于 2008-8-18 21:54 发表
问题解决了吗?
没有解决的话我建议把你的程序打个包,上传,以便于别人帮你编译,看看错误。
现在上载的方式不利于别人试,很容易弄错。


这个在别人那里可能是编译没有问题的
最大的可能是他编译环境有问题
发表于 2008-8-21 20:45 | 显示全部楼层

高手来解决……
 楼主| 发表于 2008-8-28 11:07 | 显示全部楼层
谢谢以上两位了
问题还没有解决,现在我从头开始读这个程序
因为是别人的东西,多少是有难度的
但又必须读懂····
发表于 2008-9-5 10:02 | 显示全部楼层
你把项目底下的debug目录删除重新编译看看是否能够通过
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-19 04:36 , Processed in 0.056139 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表