今天,我解決了CODEV中引入自定義間斷面的問(wèn)題。積累了經(jīng)驗(yàn),與大家分享。 ;<MHl[jJD
4Qi-zNNB
按照說(shuō)明書(shū),有間斷的面最好使用USERSUR2,但是,當(dāng)我打開(kāi)他的模板后,發(fā)現(xiàn)比較復(fù)雜,這是一個(gè)專門(mén)為菲涅爾透鏡的生成而編制的程序,參數(shù)很多,復(fù)雜之處在于處理與各個(gè)間斷點(diǎn)有關(guān)的問(wèn)題,具體我也沒(méi)太看懂,只知道是反復(fù)疊代找到交點(diǎn)。 MO1H?Uhx
]:#W$9,WL
但是,雖然codev的說(shuō)明擋中強(qiáng)調(diào)USERSUR型子程序只適合于連續(xù)表面,但考慮到,光線追跡實(shí)際上只需要知道表面的函數(shù)和該點(diǎn)的導(dǎo)數(shù),所以,如果在程序中仔細(xì)定義間斷點(diǎn)處的導(dǎo)數(shù),就可以當(dāng)成連續(xù)面來(lái)處理。 &G-dxET]
eiA$) rzy
我的解決辦法是,利用有限差分計(jì)算導(dǎo)數(shù),而且是前后差分導(dǎo)數(shù)都計(jì)算出來(lái),做對(duì)比,取絕對(duì)值小的那一個(gè)作為導(dǎo)數(shù)。因?yàn)椋苋菀桌斫,如果某個(gè)差分取在了間斷點(diǎn)的兩側(cè),一定很大。另一個(gè)較小的
%U[H`E
)eX{a/Be
就是在間斷點(diǎn)同側(cè)取的。數(shù)學(xué)上來(lái)說(shuō),相當(dāng)于左右導(dǎo)數(shù)。 2L.6!THG
2Z9ck|L>
計(jì)算表明,比較OK。 PTQN.[bBh
!(S.7#-r
USERSUR.for的使用比較簡(jiǎn)單。只需把CODEV自帶的程序,即, USERSUR.for改成自己的程序名字,再把內(nèi)容修改就可以。重要的參數(shù)就是輸出導(dǎo)數(shù)。其他像錐常數(shù),曲率等都不用。雖然,允許使用MODE參數(shù)選擇用codev自己用有限差分計(jì)算導(dǎo)數(shù),但最好別這樣。應(yīng)按如上所述處理,比較安全。 `/G9*tIR8g
xNJ*TA[+
此外,生成dll文件要使用nmake技術(shù)。注意環(huán)境變量要設(shè)對(duì)。此外,如果還出現(xiàn)找不到文件的問(wèn)題。 tI0D{Xrc
dF&@q,
那就手動(dòng)找文件,通常在fortran的安裝目錄的某些子目錄中,用windows的搜索功能就可找到,然后考備到當(dāng)前目錄下,通常是c:\CVuser. 其他問(wèn)題在codev的幫助文檔中很容易找到。 ZlMS=<hgFx
P-Gp^JX8
在nmake語(yǔ)句中,要注意空格。例如,nmake -f *******