I am resurrecting a Python program I wrote a few years under Python 3.9. I'm presently:

 * Running Python 3.11 under Mac OSX Sequoia (ver. 15.7.1)
 * Using NumPy version 1.26.4
 * Running on an Intel (x86-64) Mac Pro Desktop (2019)
 *

The program uses a Fortran 77 subroutine that was wrapped using f2py when I running Python 3.9. However, when I attempt to wrap that same subroutine (the source code is attached to this note) using f2py in Python 3.11, I get the following error message.


(base) user@Mac-Pro accgravityfiled_builder_f2py % */f2py -c accgravityfield.f -m accgravityfield /*
Traceback (most recent call last):
  File "/Users/user/opt/anaconda3/bin/f2py", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/f2py/f2py2e.py", line 766, in main
    run_compile()
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/f2py/f2py2e.py", line 594, in run_compile
    build_backend = f2py_build_generator(backend_key)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/f2py/_backends/__init__.py", line 6, in f2py_build_generator
    from ._distutils import DistutilsBackend
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/f2py/_backends/_distutils.py", line 3, in <module>
    from numpy.distutils.core import setup, Extension
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/distutils/core.py", line 24, in <module>
    from numpy.distutils.command import config, config_compiler, \
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/distutils/command/config.py", line 19, in <module>
    from numpy.distutils.mingw32ccompiler import generate_manifest
  File "/Users/user/opt/anaconda3/lib/python3.11/site-packages/numpy/distutils/mingw32ccompiler.py", line 27, in <module>     from distutils.msvccompiler import get_build_version as get_build_msvc_version
ModuleNotFoundError: No module named 'distutils.msvccompiler'
(base) user@Mac-Pro accgravityfiled_builder_f2py %


As for gfortran is concerned:


(base) user@Mac-Pro accgravityfiled_builder_f2py % gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/15.2.0/bin/../libexec/gcc/x86_64-apple-darwin24/15/lto-wrapper
Target: x86_64-apple-darwin24
Configured with: ../configure --prefix=/usr/local/opt/gcc --libdir=/usr/local/opt/gcc/lib/gcc/current --disable-nls --enable-checking=release --with-gcc-major-version-only --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-15 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-zstd=/usr/local/opt/zstd --with-pkgversion='Homebrew GCC 15.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --with-system-zlib --build=x86_64-apple-darwin24 --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.0 (Homebrew GCC 15.2.0)
(base) user@Mac-Pro accgravityfiled_builder_f2py %


I have two questions:

1. Why is f2py in a Mac OSX Intel based environment attempting to
   import '*/distutils.msvccompiler/*' that is required for Windows'
   environment only?
2. What do I need to do to eliminate this problem?

Any thoughts?

Sam Dupree

      subroutine accgravityfield( Ndim, Mdim, NMAX, Nm, Ae, GM,
     1                          C, S, X, Ac)
C -------------------------------------------------------------------------
C
C  Purpose: To compute geopotential acceleration
C  -------
C
C  Inputs:
C  ------
C     Ndim  I*4 max. degree (row dimension od C and S matrices)
C     Mdim  I*4 max. order loaded (column dimension C and S matrices)
C     NMAX  I*4 max. degree and order loaded
C       Nm  I*4 desired degree and order (Nm <= NMAX)
C       Ae  R*8 mean equatorial radius of the model [m]
C       GM  R*8 Earth gravitational constant [m**3/s**2]
C        C  R*8 array (0:Ndim,0:Mdim) Harmonic coefficients C(n,m)
C        S  R*8 array (0:Ndim,0:Mdim) Harmonic coefficients S(n,m)
C        X  R*8 array (3) ECEF cartesian coordinates [m]
C
C  Outputs:
C  -------
C       Ac  R8 array (3) with geopotential (x, y, z) accelerations [m/s**2]
C
C  Author: HKK - INPE - May 2012 - Version 1.0
C
C  References:
C  ---------- 
C
C    Kuga, H.K.; Carrara, V. "Fortran- and C-codes for higher order
C      and degree geopotential computation." 
C      www.dem.inpe.br/~hkk/software/high_geopot.html
C      Last access May 2012.
C
C -----------------------------------------------------------------------

      IMPLICIT NONE

      INTEGER NMAX, Nm, Ndim, Mdim
C      REAL*8 Ae, GM, C(0:NMAX,0:Nm), S(0:NMAX,0:Nm), x(3), Ac(3)
      DOUBLE PRECISION Ae, GM, C(0:Ndim,0:Mdim), S(0:Ndim,0:Mdim)
      DOUBLE PRECISION X(3), Ac(3)

C Locals
      INTEGER n, m
      DOUBLE PRECISION r, q, t, u, tf, al, sl, cl, Gmr
      DOUBLE PRECISION pn(0:Nm), qn(0:Nm)
      DOUBLE PRECISION Pnm, dPnm, anm, bnm, fnm
      DOUBLE PRECISION am, an, Pnm1m, Pnm2m, sm, cm, sml, cml
      DOUBLE PRECISION qC, qS, Xc, Xs, Xcf, Xsf, Xcr, Xsr, Vl, Vf, Vr
      DOUBLE PRECISION J2, J3, J4, PInm
C      DOUBLE PRECISION Omega

C
Cf2py   intent(in) Ndim, Mdim, NMAX, Nm, Ae, GM, C, S, X
Cf2py   intent(out) Ac
Cf2py   depend(Ndim,Mdim) C, S
C

C Auxiliary variables
      r   = sqrt(X(1)*X(1) + X(2)*X(2) + X(3)*X(3))
      q   = Ae / r
      t   = X(3) / r  ! sin (lat)
      u   = sqrt (1.d0 - t*t)
      tf  = t/u        ! tan (lat)
      al  = atan2( X(2), X(1) )
      sl  = sin (al)            ! sin (long)
      cl  = cos (al)            ! cos (long)
      Gmr = GM / r

      
C Process J2, J3, J4 accelerations

      Ac(1) = -GM * X(1) / r**3
      Ac(2) = -GM * X(2) / r**3
      Ac(3) = -GM * X(3) / r**3
      
      if( Nm .eq. 0 ) then
      
         if( NMAX .ge. 2 ) then
            
            PInm =  dsqrt( 1.d0 / 5.d0 )
            J2 = -C(2,0) / PInm
            
            Ac(1) = Ac(1) - J2*(3.d0/2.d0)*(Gmr/r)*(q**2)*
     1                         (X(1)/r)*(1.d0-5.d0*(t**2))
            
            Ac(2) = Ac(2) - J2*(3.d0/2.d0)*(Gmr/r)*(q**2)*
     1                         (X(2)/r)*(1.d0-5.d0*(t**2))
            
            Ac(3) = Ac(3) - J2*(3.d0/2.d0)*(Gmr/r)*(q**2)*
     1                         (X(3)/r)*(3.d0-5.d0*(t**2))
            
         end if
      
         if( NMAX .ge. 3 ) then
            
            PInm = dsqrt( 1.d0 / 7.d0 )
            J3 = -C(3,0) / PInm
            
            Ac(1) = Ac(1) - J3*(5.d0/2.d0)*(Gmr/r)*(q**3)*
     1                         (X(1)/r)*(3.d0*t-7.d0*(t**3))
            
            Ac(2) = Ac(2) - J3*(5.d0/2.d0)*(Gmr/r)*(q**3)*
     1                         (X(2)/r)*(3.d0*t-7.d0*(t**3))
            
            Ac(3) = Ac(3) - J3*(5.d0/2.d0)*(Gmr/r)*(q**3)*
     1                         (6.d0*(t**2)-7.d0*(t**4)-(3.d0/5.d0))
            
         end if
      
         if( NMAX .eq. 4 ) then
            
            PInm = dsqrt( 1.d0 / 9.d0 )
            J4 = -C(4,0)  / PInm
            
            Ac(1) = Ac(1) + J4*(15.d0/8.d0)*(Gmr/r)*(q**4)*
     1                      (X(1)/r)*(1.d0-14.d0*(t**2)+21.d0*(t**4))
            
            Ac(2) = Ac(2) + J4*(15.d0/8.d0)*(Gmr/r)*(q**4)*
     1                      (X(2)/r)*(1.d0-14.d0*(t**2)+21.d0*(t**4))
            
            Ac(3) = Ac(3) + J4*(15.d0/8.d0)*(Gmr/r)*(q**4)*
     1                 (X(3)/r)*(5.d0-70.d0*(t**2)/3.d0+21.d0*(t**4))
            
         end if
     
         return
          
      end if
      
C Summation initialization
C      Omega = 0.d0
      Vl = 0.d0
      Vf = 0.d0
      Vr = 0.d0

C Store sectoral
      pn(0) = 1.d0
      pn(1) = 1.7320508075688773D0 * u ! sqrt(3) * cos (lat)
      qn(0) = 1.d0
      qn(1) = q

      do m = 2, Nm
         am = dble(m)
         pn(m) = u * sqrt(1.d0+0.5d0/am) * pn(m-1)
         qn(m) = q * qn(m-1)
      end do

C       Initialize sin and cos recursions
      sm = 0.d0
      cm = 1.d0

C       Outer loop
      do  m = 0, Nm
      
C init 
         am = dble(m)

C For m = n 
         Pnm = pn(m)             ! m=n sectoral
         dPnm = -am * Pnm * tf
         Pnm1m = Pnm
         Pnm2m = 0.d0

C Init  Horner's scheme
         qC  = qn(m) * C(m,m)
         qS  = qn(m) * S(m,m)
         Xc  = qC * Pnm 
         Xs  = qS * Pnm
         Xcf = qC * dPnm 
         Xsf = qS * dPnm 
         Xcr = (am+1.d0) * qC * Pnm 
         Xsr = (am+1.d0) * qS * Pnm 

C Inner Loop 
         do   n = m+1, Nm
            an   = dble(n)
            anm  = sqrt( ((an+an-1.d0)*(an+an+1.d0))
     &               / ((an-am)*(an+am)) )
            bnm  = sqrt(  ((an+an+1.d0)*(an+am-1.d0)*(an-am-1.d0))
     &               / ((an-am)*(an+am)*(an+an-3.d0)) )
            fnm  = sqrt( ((an*an-am*am)*(an+an+1.d0))/(an+an-1.d0) )
C recursion P and dP
            Pnm  = anm *  t * Pnm1m - bnm * Pnm2m
            dPnm = -an * tf * Pnm   + fnm * Pnm1m / u   ! Signal opposite to 
paper

C Store
            Pnm2m = Pnm1m
            Pnm1m = Pnm

C Inner sum
            if (n .lt. 2) cycle
            
            qC = qn(n) * C(n,m)
            qS = qn(n) * S(n,m)
            Xc = (Xc + qC * Pnm)
            Xs = (Xs + qS * Pnm)
            Xcf = (Xcf + qC * dPnm)
            Xsf = (Xsf + qS * dPnm)
            Xcr = (Xcr + (an+1.d0) * qC * Pnm) 
            Xsr = (Xsr + (an+1.d0) * qS * Pnm) 
         end do

C Outer sum
C        Omega = Omega + (Xc*cm + Xs*sm)  
         Vl = Vl + am*(Xc *sm - Xs *cm) 
         Vf = Vf +    (Xcf*cm + Xsf*sm) 
         Vr = Vr +    (Xcr*cm + Xsr*sm)

C sin and cos recursions to next m
         cml = cl*cm - sm*sl
         sml = cl*sm + cm*sl
         cm = cml ! save to next m
         sm = sml ! save to next m

      end do

C Finalization, include n=0 (P00=1), 
C for n=1 all terms are zero: C,S(1,1), C,S(1,0) = 0

C Potential
C      Omega =  Gmr * (1.d0+Omega)

C Gradient 
      Vl = -Gmr * Vl
      Vf =  Gmr * Vf
      Vr = -(Gmr/r) * (1.d0+Vr)

C Body X, Y, Z accelerations 
      Ac(1) = u*cl*Vr - t*cl*Vf/r - sl*Vl/(u*r)
      Ac(2) = u*sl*Vr - t*sl*Vf/r + cl*Vl/(u*r)
      Ac(3) =    t*Vr +    u*Vf/r

      return
      end
_______________________________________________
NumPy-Discussion mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/numpy-discussion.python.org
Member address: [email protected]

Reply via email to