Fortran Coder

查看: 487|回复: 10

[求助] 有偿求助点云曲面拟合函数接口

[复制链接]

14

帖子

3

主题

0

精华

入门

F 币
66 元
贡献
34 点
发表于 2024-6-16 09:59:31 | 显示全部楼层 |阅读模式
现有曲面点云数据(Xi,Yi,Zi),曲面范围很小(投影面Xi,Yi)是一个局部有限的连续空间曲面,想求助可以根据点云数据,确定曲面拟合的接口函数(如NURBS曲面),多项式最小二乘法拟合效果不太好(已经尝试过了),采用IMSL库自带的Surface_Fitting函数调用提示Compliation Aborted,估计是编译器不兼容,请问有没有朋友做过类似的接口或者有相关的经验,可以提供对应的接口或者函数不?跪谢了,有偿求助,不胜感激! 我的编译器版本是IVF2013,IMSL7.0,后者可以解决imsl调用的问题也可以。 如果愿意提供帮助的,麻烦您联系:

QQ: 50604800

有偿求助,跪谢!

14

帖子

3

主题

0

精华

入门

F 币
66 元
贡献
34 点
 楼主| 发表于 2024-6-16 10:13:08 | 显示全部楼层
  调用IMSL中的一个使用手册的例子程序如下(顺带编译报错结果,去掉调用函数Surface_Fitting,则编译可以通过)
[Fortran] 纯文本查看 复制代码
  program Test_SurfaceFitting
      INCLUDE 'link_fnl_shared.h'
      use numerical_libraries
  
      USE surface_fitting_int
      USE rand_int
      USE norm_int

      implicit none

! This is Example 1 for SURFACE_FITTING, tensor product
! B-splines approximation.  Use the function
! exp(-x**2-y**2) on the square (0, 2) x (0, 2) for samples.
! The spline order is "nord" and the number of cells is
! "(ngrid-1)**2".  There are "ndata" data values in the square.

      integer :: i
      integer, parameter :: ngrid=9, nord=4, ndegree=nord-1, &
      nbkpt=ngrid+2*ndegree, ndata = 2000, nvalues=100
      real(kind(1d0)), parameter :: zero=0d0, one=1d0, two=2d0
      real(kind(1d0)), parameter :: TOLERANCE=1d-3
      real(kind(1d0)), target :: spline_data (4, ndata), bkpt(nbkpt), &
             & coeff(ngrid+ndegree-1,ngrid+ndegree-1), delta, sizev, &
             & x(nvalues), y(nvalues), values(nvalues, nvalues)
      real(kind(1d0)), pointer :: pointer_bkpt(:)
      type (d_spline_knots) knotsx, knotsy

! Set Random Number generator seed
                                             
      real(kind(1d0)),parameter::zero_par=0.d0
      real(kind(1d0))::dummy_par(0)
      integer iseed_par,lev_par
      type(d_options)::iopti_par(2)

      iseed_par = 53976279
      iopti_par(1)=d_options(d_rand_gen_generator_seed,zero_par)
      iopti_par(2)=d_options(iseed_par,zero_par)

      call rand_gen(dummy_par,iopt=iopti_par)

! Generate random (x,y) pairs and evaluate the
! example exponential function at these values.   
      spline_data(1:2,:)=two*rand(spline_data(1:2,:))
      spline_data(3,:)=exp(-sum(spline_data(1:2,:)**2,dim=1))
      spline_data(4,:)=one

! Define the knots for the tensor product data fitting problem.
      delta = two/(ngrid-1)
      bkpt(1:ndegree) = zero
      bkpt(nbkpt-ndegree+1:nbkpt) =  two
      bkpt(nord:nbkpt-ndegree)=(/(i*delta,i=0,ngrid-1)/)

! Assign the degree of the polynomial and the knots.
      knotsx%spline_degree=ndegree
      knotsx%d_knots=>bkpt
      knotsy%spline_degree=knotsx%spline_degree
      knotsy%d_knots=>knotsx%d_knots

! Fit the data and obtain the coefficients.
      coeff = surface_fitting(spline_data, knotsx, knotsy)

! Evaluate the residual = spline - function
! at a grid of points inside the square.
      delta=two/(nvalues+1)
      x=(/(i*delta,i=1,nvalues)/); y=x

      values=exp(-spread(x**2,1,nvalues)-spread(y**2,2,nvalues))
      values=surface_values((/0,0/), x, y, knotsx, knotsy, coeff)-values
            
! Compute the R.M.S. error:
      sizev=norm(pack(values, (values == values)))/nvalues

      if (sizev <= TOLERANCE) then
         write (*,*) 'SURFACE_FITTING_EX1 Passed on pcdsms.'
      else
         write(*,*) 'SURFACE_FITTING_EX1 ********** Failed on pcdsms **********'
      end if
end program

在IVF2013中调用MSL6.0函数库中的B样条拟合曲面函数,Surface_Fitting函数,编译的时候出现如下报错:
1>------ 已启动生成:  项目: SurfaceFitting, 配置: Debug Win32 ------
1>Compiling with Intel(R) Visual Fortran Compiler XE 14.0.1.139 [IA-32]...
1>SurfaceFitting.f90
1>fortcom: Fatal: There has been an internal compiler error (C0000005).
1>compilation aborted for E:\IVF_File\SurfaceFitting\SurfaceFitting\SurfaceFitting.f90 (code 1)
1>
1>Build log written to  "file://E:\IVF_File\SurfaceFitting\SurfaceFitting\Debug\BuildLog.htm"
1>SurfaceFitting - 1 error(s), 0 warning(s)
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

1995

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1481 元
贡献
636 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2024-6-19 10:41:20 | 显示全部楼层
这个应该是 IMSL 的问题。surface_fitting_int.mod 文件损坏了,找找官方吧。

14

帖子

3

主题

0

精华

入门

F 币
66 元
贡献
34 点
 楼主| 发表于 2024-6-19 14:23:53 | 显示全部楼层
谢谢坛主,Surface_Fitting.Mod的文件损坏了,还有其他的调用方式可以实现吗?谢谢。

1995

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1481 元
贡献
636 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2024-6-19 15:09:14 | 显示全部楼层
你可以试图根据帮助文档,自己写一个同名的 Module Surface_fitting_int。
只需要包含你需要调用的函数即可,只写函数接口,不写函数内部实现过程。

14

帖子

3

主题

0

精华

入门

F 币
66 元
贡献
34 点
 楼主| 发表于 2024-6-19 22:59:38 | 显示全部楼层
fcode 发表于 2024-6-19 15:09
你可以试图根据帮助文档,自己写一个同名的 Module Surface_fitting_int。
只需要包含你需要调用的函数即可 ...

谢谢堂主,本人愚钝,不明深意,写一个同名的Module,但是接口无法调用,又如何能够实现呢?

1995

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1481 元
贡献
636 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2024-6-20 11:38:52 | 显示全部楼层
大概就像这样,我只复原了 D_SURFACE_FITTING 和 DV_SURFACE_VALUES 两个函数。没有写其他接口。
某些版本的IMSL可能是 D_SURFACE_VALUES 而不是 DV_SURFACE_VALUES。

[Fortran] 纯文本查看 复制代码
Module surface_fitting_int
  USE norm_int
  implicit none
  interface surface_fitting
    function D_SURFACE_FITTING(DATA,KNOTSX,KNOTSY,CONSTRAINTS,COVARIANCE,IOPT,epack)
      import
      implicit none
      type (d_spline_knots) :: knotsx, knotsy
      real(kind(1d0)) :: DATA(:,:)
      type (d_SURFACE_CONSTRAINTS) , optional :: CONSTRAINTS(:)
      real(kind(1d0)) , optional :: COVARIANCE(:,:)
      type (d_options) , optional :: iopt(:)
      type (d_error) , optional :: epack
      real(kind(1d0)) :: D_SURFACE_FITTING(size(KNOTSX%D_KNOTS)-KNOTSX%SPLINE_DEGREE-1,size(KNOTSY%D_KNOTS)-KNOTSY%SPLINE_DEGREE-1)
    end function D_SURFACE_FITTING    
  end interface surface_fitting

  interface SURFACE_VALUES    
    function DV_SURFACE_VALUES(DERIVATIVE, VARIABLESX, VARIABLESY, KNOTSX, KNOTSY, COEFFS)
      import
      implicit none
      integer :: DERIVATIVE(2)
      real(kind(1d0)) :: VARIABLESX(:), VARIABLESY(:)
      type (d_spline_knots) :: knotsx, knotsy
      real(kind(1d0)) :: COEFFS(:,:)
      real(kind(1d0)) :: DV_SURFACE_VALUES(size(VARIABLESX),size(VARIABLESY))
    end function DV_SURFACE_VALUES
  end interface SURFACE_VALUES

End Module surface_fitting_int



14

帖子

3

主题

0

精华

入门

F 币
66 元
贡献
34 点
 楼主| 发表于 2024-6-20 16:02:56 | 显示全部楼层
fcode 发表于 2024-6-20 11:38
大概就像这样,我只复原了 D_SURFACE_FITTING 和 DV_SURFACE_VALUES 两个函数。没有写其他接口。
某些版本 ...

堂主太伟大了,谢谢啦,我试试看看能否解决问题。

14

帖子

3

主题

0

精华

入门

F 币
66 元
贡献
34 点
 楼主| 发表于 2024-6-20 17:34:16 | 显示全部楼层
堂主好,我亲自试验了,真的可以解决这个问题啊,重新编译没有报错了,直接通过!
堂主太伟大了,顺便请教下:为什么封装一下就可以编译通过呢?这是啥原因呢?谢谢!

1995

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1481 元
贡献
636 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2024-6-20 19:01:42 | 显示全部楼层
天马行空 发表于 2024-6-20 17:34
堂主好,我亲自试验了,真的可以解决这个问题啊,重新编译没有报错了,直接通过!
堂主太伟大了,顺便请教 ...

Module 编译出来的 .mod 文件就像是C语言的头文件。
但是不同编译器编译出来的 .mod 格式有些不同。
可能是 IMSL 用的编译器和 intel 现在的编译器有些区别,就导致直接使用IMSL官方的 .mod 文件出错。

重新封装一个 Module ,然后用现在的 intel 编译器编译出自己的 .mod 文件,就没问题了。
但这样编译出来的 .mod 文件,只能使用这两个函数,并不是完整的。
如果要使用别的函数,也需要再复原其他函数的接口才行。

原则上,IMSL应该像其他一些函数库一样,公布这种接口 module 的源代码,但似乎并没有。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-7-23 20:07

Powered by Tencent X3.4

© 2013-2024 Tencent

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