日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Fortran moudle/subroutine/function 的用法示例

發(fā)布時(shí)間:2023/12/20 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fortran moudle/subroutine/function 的用法示例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

吐槽:作為一個(gè)Fortran 語(yǔ)言的初學(xué)者,本人深刻體會(huì)到 fortran 對(duì)于像我這樣母語(yǔ)是C 的編程小白的強(qiáng)烈不友好!幾天不碰,想要實(shí)現(xiàn)一個(gè)小小的功能就舉步維艱。所以我覺(jué)得還是要多總結(jié),今天閑來(lái)無(wú)事,就對(duì) moudle/subroutine/function 這些用法做一個(gè)簡(jiǎn)單的小結(jié)8!
正文
知識(shí)點(diǎn)什么的,書(shū)上,網(wǎng)上一大堆,所以就不在這里多費(fèi)筆墨了,這里主要講一個(gè)簡(jiǎn)單的例子。
1、題目

題目是一個(gè)簡(jiǎn)單的雙線性內(nèi)插的計(jì)算,為了涵蓋moudle/subroutine/function 所以本人采用了如下的方法

2、看到題目,我就想創(chuàng)建一個(gè)結(jié)構(gòu)體——moudle 的用法

module typedeftype pointreal x,y,zend type containssubroutine set_p(p,x,y,z)type(point) preal x,y,zp.x=x;p.y=y;p.z=zend subroutine !Attention heresubroutine show_p(P)type(point) Pprint 100," x=",P.x," y=",P.y," f(x,y)=",P.z 100 format(a4,f9.3,a4,f9.3,a9,f9.3) end subroutine end module

可以看到,創(chuàng)建了一個(gè)point 結(jié)構(gòu)體,就相當(dāng)于C++ 里面的類,里面有x,y,z 三個(gè) real 型的量,其中 z=f(x,y)
然后 contains 了倆子例程

set_p //為結(jié)構(gòu)體賦值 show_p//打印結(jié)構(gòu)體

值得注意的是,
1)在moudle 里面的子例程結(jié)束的時(shí)候必須用
end subroutine subroutine 是不可以省去的
2)在使用自定義的結(jié)構(gòu)體時(shí),用
type(point) p 有別與C/C#中的 point p

3、函數(shù)——function 的用法

function fun(Q1,Q2,x) result(P)use typedefimplicit nonetype(point) Q1,Q2,Preal x !x is PQ1/PQ2P.z=x*Q2.z+(1-x)*Q1.zP.x=x*Q2.x+(1-x)*Q1.xP.y=x*Q2.y+(1-x)*Q1.yend

fun 是函數(shù)名字,后邊()中的是傳入形參,result()里面是傳出形參
用moudle 的時(shí)候,要加use typedef 類似于C 里面的include <...> 你得告訴人家你用的模塊的叫什么,不然別人怎么清楚你用的是什么

4、子例程——subroutine 的用法

subroutine sub(Q11,Q12,Q21,Q22,P) use typedefimplicit nonetype(point) Q11,Q12,Q21,Q22,P,R1,R2,fun !Attention hereR1=fun(Q11,Q21,(P.x-Q11.x)/(Q21.x-Q11.x))R2=fun(Q12,Q22,(P.x-Q12.x)/(Q22.x-Q12.x))P=fun(R1,R2,(P.y-R1.y)/(R2.y-R1.y))end subroutine

在這里,可以看到,在使用function 的時(shí)候,要對(duì)fun 下定義!!!
這里請(qǐng)注意如何調(diào)用fun的!
無(wú)論是function 還是 subroutine 都要對(duì)()里面的參數(shù)下定義,參數(shù)的類型說(shuō)明不是放在括號(hào)里面,而是現(xiàn)于內(nèi)部。

老師說(shuō)subroutine 和 function 并沒(méi)有本質(zhì)的區(qū)別,但是個(gè)人更喜歡subroutine ,因?yàn)樯蠙C(jī)的時(shí)候想用function 把我搞炸了(小聲bb)

5、完整程序及輸出結(jié)果

module typedeftype pointreal x,y,zend type containssubroutine set_p(p,x,y,z)type(point) preal x,y,zp.x=x;p.y=y;p.z=zend subroutine !Attention heresubroutine show_p(P)type(point) Pprint 100," x=",P.x," y=",P.y," f(x,y)=",P.z 100 format(a4,f9.3,a4,f9.3,a9,f9.3) end subroutine end moduleprogram Hellouse typedefimplicit nonetype(point) Q11,Q12,Q21,Q22,P !Attention herereal x,ycall set_p(Q11,0.0,0.0,0.0)call set_p(Q21,1.0,0.0,1.0)call set_p(Q12,0.0,1.0,2.0)call set_p(Q22,1.0,1.0,3.0)p.x=0.3;p.y=0.7call sub(Q11,Q12,Q21,Q22,P)print *,"Q11:"call show_p(Q11)print *,"Q12:"call show_p(Q12)print *,"Q21:"call show_p(Q21)print *,"Q22:"call show_p(Q22)print *,"P:"call show_p(P)pauseendsubroutine sub(Q11,Q12,Q21,Q22,P) use typedefimplicit nonetype(point) Q11,Q12,Q21,Q22,P,R1,R2,fun !Attention hereR1=fun(Q11,Q21,(P.x-Q11.x)/(Q21.x-Q11.x))R2=fun(Q12,Q22,(P.x-Q12.x)/(Q22.x-Q12.x))P=fun(R1,R2,(P.y-R1.y)/(R2.y-R1.y))end subroutinefunction fun(Q1,Q2,x) result(P)use typedefimplicit nonetype(point) Q1,Q2,Preal x !x is PQ1/PQ2P.z=x*Q2.z+(1-x)*Q1.zP.x=x*Q2.x+(1-x)*Q1.xP.y=x*Q2.y+(1-x)*Q1.yend

這里請(qǐng)注意如何調(diào)用sub的!
輸出結(jié)果

Q11:x= 0.000 y= 0.000 f(x,y)= 0.000Q12:x= 0.000 y= 1.000 f(x,y)= 2.000Q21:x= 1.000 y= 0.000 f(x,y)= 1.000Q22:x= 1.000 y= 1.000 f(x,y)= 3.000P:x= 0.300 y= 0.700 f(x,y)= 1.700

總結(jié)

以上是生活随笔為你收集整理的Fortran moudle/subroutine/function 的用法示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。