
發(fā)布
注冊
/
登錄ansys 編寫函數(shù)的案例
umat子程序編寫常用的fortran函數(shù)分享(四)
subroutine Voigt_to_forth(b,a)
include 'ABA_PARAM.INC'
dimension a(3,3,3,3), b(6,6)
do i = 1,3
do j = 1,3
ia = i
if (i.ne.j) ia=9-i-j
do k = 1,3
do l = 1,3
ib = k
if (k.ne.l) ib=9-k-l
a(i,j,k,l) = b(ia,ib)
if (ia.gt.3) a(i,j,k,l) = a(i,j,k,l) / 2
if (ib.gt.3) a(i,j,k,l) = a(i,j,k,l) / 2
end do
end do
end do
end do
return
end
sgn函數(shù)
展開 提高代碼質(zhì)量:如何編寫函數(shù)
for循環(huán)嵌套優(yōu)化
for循環(huán)嵌套相比于if嵌套來說更加復(fù)雜,閱讀起來會更麻煩,下面說說幾點要注意的東西:
1、最多只能兩層for循環(huán)嵌套
2、提取內(nèi)層循環(huán)到新函數(shù)中
3、多層循環(huán)時,不要簡單地位索引變量命名為i,j,k等,容易造成混淆,要有具體的意思
提取復(fù)雜邏輯,語義化
有的時候,我們會寫出一些比較復(fù)雜的邏輯,閱讀代碼的人看到后可能搞不清楚要做什么,這個時候,就應(yīng)該提取出這段復(fù)雜的邏輯代碼。
這段代碼表示當年齡大于18并且是男性的話,可以doSth,但是還是不夠清晰,可以將其提取出來
雖說多了一個函數(shù),但是代碼更加清晰和語義化了。
總結(jié)
本文從函數(shù)命名,函數(shù)參數(shù)和函數(shù)的代碼編寫三個方面談了關(guān)于如何編寫好一個函數(shù)的感受和想法。文中提到了很多具體的情況,當然日常編碼中肯定會遇到更多復(fù)雜的情況可能我暫時沒有想到。我簡單的歸納了幾點:
1、準確地對變量、函數(shù)命名
2、不要有重復(fù)邏輯的代碼
3、函數(shù)的行數(shù)不要超過20行,這里的20行只是個大概,并不一定是這個數(shù)字
4、減少嵌套
我相信大家一定會很多關(guān)于這方面的經(jīng)驗,歡迎進行交流,共同提高代碼質(zhì)量。
展開 umat子程序編寫常用的fortran函數(shù)分享(三)
計算3*3矩陣的逆矩陣
subroutine inv3x3(A,invA,det)
implicit none
real(8), intent(in) :: A(3,3)
real(8), intent(out) :: invA(3,3), det
integer :: i,j
call deter3x3(A,det)
if (abs(det) < 1e-6) then
invA=0.0d+0
else
invA(1,1)=((A(2,2)*A(3,3))-(A(2,3)*A(3,2)))/det
invA(2,1)=-((A(2,1)*A(3,3))-(A(2,3)*A(3,1)))/det
invA(3,1)=((A(2,1)*A(3,2))-(A(2,2)*A(3,1)))/det
invA(1,2)=-((A(1,2)*A(3,3))-(A(1,3)*A(3,2)))/det
invA(2,2)=((A(1,1)*A(3,3))-(A(1,3)*A(3,1)))/det
invA(3,2)=-((A(1,1)*A(3,2))-(A(1,2)*A(3,1)))/det
invA(1,3)=((A(1,2)*A(2,3))-(A(1,3)*A(2,2)))/det
invA(2,3)=-((A(1,1)*A(2,3))-(A(2,1)*A(1,3)))/det
invA(3,3)=((A(1,1)*A(2,2))-(A(1,2)*A(2,1)))/det
endif
return
end subroutine inv3x3
計算2*2矩陣的逆:
subroutine inv2x2(A
展開 umat子程序編寫常用的fortran函數(shù)分享(二)
3*1向量叉乘:
subroutine vecprod(dvin1,dvin2,dvout)
implicit none
real(8), intent(in) :: dvin1(3), dvin2(3)
real(8), intent(out) :: dvout(3)
dvout(1)=dvin1(2)*dvin2(3)-dvin1(3)*dvin2(2)
dvout(2)=dvin1(3)*dvin2(1)-dvin1(1)*dvin2(3)
dvout(3)=dvin1(1)*dvin2(2)-dvin1(2)*dvin2(1)
return
end subroutine vecprod
3*1向量點乘:
subroutine dotprod(dvin1,dvin2,dvout)
implicit none
real(8), intent(in) :: dvin1(3), dvin2(3)
real(8), intent(out) :: dvout(3)
dvout = dvin1(1)*dvin2(1)+dvin1(2)*dvin2(2)+dvin1(3)*dvin2(3)
dvout = abs(dvout)
return
end subroutine dotprod
3*3矩陣的行列式的值:
subroutine deter3x3(dmin,d)
implicit none
real(8), intent(in) :: dmin(3,3
展開 
umat子程序編寫常用的fortran函數(shù)分享(一)
計算2*2矩陣的跡:
subroutine trace2x2(a,aii)
implicit none
real(8), intent(in) :: a(2,2)
real(8), intent(out) :: aii
aii = a(1,1)+a(2,2)
return
end subroutine trace2x2
計算3*3矩陣的跡:
subroutine trace3x3(a,aii)
implicit none
real(8), intent(in) :: a(3,3)
real(8), intent(out) :: aii
aii = a(1,1)+a(2,2)+a(3,3)
return
end subroutine trace3x3
將向量(9*1:變形梯度)轉(zhuǎn)化為3*3矩陣存儲
subroutine vecmat9(dvin,dmout)
implicit none
real(8), intent(in) :: dvin(9)
real(8), intent(out) :: dmout(3,3)
integer :: i
dmout(1,1) = dvin(1)
dmout(1,2) = dvin(2)
dmout(1,3) = dvin(3)
dmout(2,1) = dvin(4)
dmout(2,2) = dvin(5)
dmout(2,3
展開 六自由度機械臂五次多項式軌跡規(guī)劃(Fivejtraj_Function自編寫函數(shù)) ¥56
clear,clc,close all
format compact
robotModel=4;DH_Param;JointNum=length(DH);
ROCR6v2 關(guān)節(jié)2、3偏置
qlim=deg2rad([-179,179;-146,146;-146,146;-179,179;-179,179;-179,179]);
for i=1:JointNum
L(i)=RevoluteMDH('d',DH(i,3),'a',DH(i,2),'alpha',deg2rad(DH(i,1)), ...
'offset',deg2rad(DH(i,4)),'qlim',qlim(i,:));
end
robot=SerialLink(L,'name','robot');
robot.display();
robot =
robot:: 6 axis, RRRRRR, modDH, fastRNE
+---+-----------+-----------+-----------+-----------+-----------+
| j | theta | d | a | alpha | offset |
+---+-----------+-----------+-----------+-----------+-----------+
| 1| q1| 0.1215| 0| 0| 0|
| 2| q2| 0.1225| 0| 1.5708| -1.5708|
|
展開 從形函數(shù)與函數(shù)的連續(xù)可導(dǎo)性到ansys結(jié)果中的節(jié)點解與單元解的差異
如題,《從形函數(shù)與函數(shù)的連續(xù)可導(dǎo)性到ansys結(jié)果中的節(jié)點解與單元解的差異》,形函數(shù)對結(jié)果的影響大部分人都能聯(lián)想到二次單元比線性單元求得的結(jié)果更精確,但該文要表達的不僅如此,而是從更一般地討論怎么從單元的形函數(shù)來理解節(jié)點解與單元解之間的差異。
首先討論單元的階次。作為基礎(chǔ)我們應(yīng)該明白網(wǎng)格與單元的區(qū)別,網(wǎng)格是將幾何體離散化后的結(jié)構(gòu),即組成幾何體的微元,單元是這些微元的幾何、物理或數(shù)學屬性(這里我們并不打算詳細討論單元的這些屬性,但是這些知識會方便對本文的理解)。我們經(jīng)常在使用ansys或其他CAE軟件時經(jīng)常會遇到單元的選擇以及單元階次的選擇,一般一種單元包括線性單元和二次單元甚至更高級的單元,比如在ansys中經(jīng)常被使用的shell181(左)和shell281(右),線性單元使用的形函數(shù)是一次的多項式,高次單元使用的形函數(shù)是高次的多項式,形函數(shù)用于描述相鄰節(jié)點之間的位移場,所以高次的單元可以更好的描述形狀復(fù)雜的幾何體。
不同于常規(guī)材料力學中通過平衡方程求解(首先求得的解是力解),有限元方式求解的特點是首先求解出的結(jié)果是節(jié)點的位移解,即displacement of nodes,所有的節(jié)點位移形成了位移場,在空間上位移場一定是連續(xù)的,但是不一定是平滑的。哎哎,是不是特別熟悉的感覺,正是和高數(shù)中函數(shù)的連續(xù)性和可導(dǎo)性兩個性質(zhì)非常相似,不用奇怪,位移場本來就是用函數(shù)描述的,所以自然就存在函數(shù)的性質(zhì),所以用函數(shù)的性質(zhì)來理解就可以方便解釋一些現(xiàn)象了,下圖分別是用兩種形函數(shù)描述的位移場,在有限元求解后得到的首先是節(jié)點位移解,即圖中5個節(jié)點的位移,假如每個節(jié)點的位移用坐標x\y\z的函數(shù)來表示,然后通過形函數(shù)插值得到相鄰節(jié)點之間的位移(也是xyz的函數(shù)),上圖是用一次形函數(shù)插值,下圖是用二次形函數(shù)插值。
展開 ansys編寫游戲
ansys編寫游戲
一 、將battle.mac文件放到ansys工作路徑下
二、在ansys命令流窗口輸入battle
三、運行結(jié)果
感興趣的可以下載運行
battle.rar
ANSYS--編寫宏的建議
在宏中加入編寫者的名字、編寫的日期、針對的ANSYS版本也是非常有用的。因為可以幫助其他用戶了解該宏,并根據(jù)最新的版本進行更新。記住編寫宏的第一定律:今天的宏在明天就會變異成象形文字。現(xiàn)在看起來充滿邏輯和顯而易見的事,下周就會需要三個小時來破解,半年后的難度可能就僅次于曼哈頓計劃了。現(xiàn)在花一、兩分鐘在宏的開始添加的信息會讓你和其他使用者以后更輕松。
注釋
根據(jù)上面的第一定律,我們應(yīng)該把正在做的和為什么這樣做都完全寫入注釋,就象將來的使用者對這個宏毫無了解一樣。因為六個月后,你可能就是這個使用者。
參數(shù)的使用
以下劃線開始的參數(shù)是ANSYS用于UIDL菜單、追蹤信息(寫入CDWRITE,LSWRITE文件,關(guān)鍵字狀態(tài)等)的保留參數(shù)。因此最好不要以下劃線開始來命名參數(shù),以避免和現(xiàn)在或以后ANSYS會使用的參數(shù)沖突。
跟蹤下劃線參數(shù)
這種情況發(fā)生在編寫的宏將來會被其他人使用的情況,實質(zhì)上我們一般都會和同事共享宏,因此幾乎所有的宏都是這樣的。每一個宏都應(yīng)該在宏的開始和結(jié)尾通過“*DEL,,PRM”命令清除參數(shù)。這會使你在宏中創(chuàng)建的參數(shù)不會與已定義的參數(shù)產(chǎn)生沖突或帶來問題。
局部參數(shù)
任何人都可以在自己的宏中使用如AR20-AR99的局部參數(shù)。局部參數(shù)只能在指定的宏中使用,并且在該宏完成以后自動消失。局部參數(shù)還可以用于嵌套的宏中。
普通參數(shù)
如果你編寫的宏只是自己使用,那么你可以使用任何你喜歡的參數(shù)名。如果你的宏已經(jīng)調(diào)試并且運行成功,你可以在宏的開始使用“/NOPR”使無用的信息不出現(xiàn)在輸出窗口中。而在運行完宏以后,使用“/GOPR”重新激活輸出窗口。確保在“IF“命令之后使用“ENDIF”來結(jié)束;使用“*EXIT”而不要使用“*GO”來退出IF循環(huán)。
展開 ansys的取值函數(shù)
有關(guān)實體狀態(tài)的取值函數(shù)
NSEL(N)
ESEL(E)
KSEL(K)
LSEL(L)
ASEL(A)
VSEL(V)
表示某個實體狀態(tài),其返回值-1,沒有選中,0,沒有定義,1,被選中
有關(guān)下一個被選實體的取值函數(shù)
NDNEXT(N)
ELNEXT(E)
KPNEXT(K)
LSNEXT(L)
ARNEXT(A)
VLNEXT(V)
表示編號大于N,E,K,L,A,V的下一個被選實體
有關(guān)實體位置的取值函數(shù)
CENTRX(E)
CENTRY(E)
CENTRZ(E)
單元E在中心位置的X,Y,Z的坐標系(直角坐標系),有所選的節(jié)點決定
NX(N)
NY(N)
NZ(N)
KX(K)
KY(K)
KZ(K)
節(jié)點N或關(guān)鍵點K在激活坐標系中X,Y,Z的坐標值
LX(L,LFRAC)
LY(L,LFRAC)
LZ(L,LFRAC)
線段L在長度比率為LFRAC(0~1)時的X,Y,Z的坐標值
有關(guān)最靠近某位置的節(jié)點或關(guān)鍵點編號的取值函數(shù)
NODE(X,Y,Z)
KP(X,Y,Z)
被選擇的節(jié)點嘴靠近X,Y,Z位置的節(jié)點或關(guān)鍵點編號(在激活的坐標系下,如果存在多個節(jié)點或關(guān)鍵點,那么取其最小值)
有關(guān)距離的取值函數(shù)
DISTND(N1,N2)
DISTKP(K1,K2)
節(jié)點或關(guān)鍵點兩點之間的距離
DISTEN(E,N)
單元E的中心點與節(jié)點N之間的距離,中心點將由單元上被選擇的節(jié)點確定
有關(guān)角度的取值函數(shù)
ANGLEN(N1,N2,N3)
ANGLEK(K1,K2,K3)
節(jié)點或關(guān)鍵點兩條邊之間的夾角,缺省時單位為弧度,其中所選擇的3個節(jié)點中,N1或K1是頂點
有關(guān)最靠近實體的節(jié)點,關(guān)鍵點和單元的取值函數(shù)
NNEAR(N)
最靠近節(jié)點N的被選節(jié)點
KNEAR(K)
最靠近關(guān)鍵點K的被選關(guān)鍵點
ENEARN(N)
最靠近節(jié)點N的被選單元,單元的位置將由被選節(jié)點確定
有關(guān)面積的取值函數(shù)
展開 ANSYS 內(nèi)部函數(shù)
VLNEXT(N)
Next higher volume number above N in selected set (or zero if none
found).
30.距離函數(shù)
DISTND(N1,N2) Distance between nodes N1 and N2.
DISTKP(K1,K2) Distance between keypoints K1 and K2.
DISTEN(E,N) Distance between the centroid of element E and node N.
Centroid is determined from the selected nodes on the element.
31.角度函數(shù) (缺省單位為弧度,單位變換用 *AFUN 命令)
ANGLEN(N1,N2,N3) Subtended angle between two lines (defined by
three nodes where N1 is the vertex node). Default is in
radians.
ANGLEK(K1,K2,K3) Subtended angle between two lines (defined by
three keypoints where K1 is the vertex keypoint). Default is in
radians.
32.最近實體函數(shù)
NNEAR(N) Selected node nearest node N.
KNEAR(K) Selected keypoint nearest keypoint K.
ENEARN(N) Selected element nearest node N.
展開 
Ansys Zemax光學設(shè)計軟件技術(shù)教程:如何編寫ZPL宏:計算環(huán)帶垂軸色差
該宏將產(chǎn)生以下繪圖:
光研科技南京有限公司是國內(nèi)可靠的Ansys Zemax光學設(shè)計軟件代理商!公司已經(jīng)為廣大企業(yè),研究所以及高校提供了很多優(yōu)秀的相關(guān)產(chǎn)品和服務(wù),在行業(yè)內(nèi)建立了值得信任的口碑。
Ansys Zemax光學軟件
咨詢與訂購方式
聯(lián)系人:光研科技南京有限公司徐保平
手機號:15051861513
微信號:13627124798
Ansys Zemax | 什么是點擴散函數(shù)( PSF )
附件下載
聯(lián)系工作人員獲取附件
本文討論了如何在 OpticStudio 中對點擴散函數(shù)進行建模和解釋。使用的分析特征是 Spot Diagram、FFT PSF 和 Huygens PSF。將討論每種工具的優(yōu)點,以及用于最準確分析的有用特征設(shè)置。
介紹
光學系統(tǒng)的點擴散函數(shù) (PSF) 是單個點光源產(chǎn)生的輻照度分布。(望遠鏡拍攝遙遠恒星的圖像就是一個很好的例子。盡管源可能是一個點,但圖像不是。有兩個主要原因:首先系統(tǒng)中的像差會將圖像傳播到有限的區(qū)域;其次衍射效果也會擴散圖像,即使在沒有像差的系統(tǒng)中也是如此。
OpticStudio 有三種基本類型的 PSF 計算:幾何(無衍射)點列圖、基于衍射的 FFT 和 Huygens PSF。本文將討論基本理論,并就正確使用每種類型的 PSF 提供一些指導(dǎo)。
點列圖
OpticStudio 中最基本的分析功能之一是點列圖。此功能從物空間中的單視場點發(fā)射許多光線,通過光學系統(tǒng)追跡所有光線,并繪制所有光線相對于某個公共參考的 (x,y) 坐標。因此,點列圖本身就可以看作一個幾何 PSF。
這里使用的示例光學系統(tǒng)是一個焦距為 50 mm 的單拋物面 F/5 反射鏡,物位于無窮遠處。該系統(tǒng)是一個簡化的牛頓望遠鏡,包含的示例文件為 PSF_Newtonian.ZMX。以下是光學系統(tǒng)的外觀:
兩個視場點(一個在軸上,另一個呈 2 度角)的點列圖如下所示。
請注意,點列圖是光線落點的集合,每個點表示一條光線。光線之間沒有相互作用或干擾。點列圖在顯示望遠鏡的幾何或光線像差的影響方面非常有效。離軸幾何 PSF 清楚地顯示了系統(tǒng)的彗差和像散。然而在軸上,點列圖預(yù)測了完美的成像。但這是否準確代表了光學系統(tǒng)的性能?為了回答點列圖結(jié)果的這個問題,我們需要將點列分布與衍射極限響應(yīng)進行比較。
展開 ANSYS 支持的函數(shù)列表
ANSYS 支持的函數(shù)列表,備用與共享,以后不要老再去找了
SIN(X) Sine
COS(X) Cosine
TAN(X) Tangent
ASIN(X) Arcsine
ACOS(X) Arccosine
ATAN(X) Arctangent
ATAN2(Y,X) Arctangent (Y/X) with the sign of each component considered
SINH(X) Hyperbolic sine
COSH(X) Hyperbolic cosine
TANH(X) Hyperbolic tangent
SQRT(X) Square root
ABS(X) Absolute value
SIGN(X,Y) Absolute value of X with sign of Y.
展開 ANSYS的“get”函數(shù)列表
自己收藏并與大家分享,來自于ANSYS的help
“get函數(shù)”可用于某些項,并可用于代替*get命令。函數(shù)返回值并在函數(shù)被輸入的地方使用它,繞過了用參數(shù)名存儲值和在要使用值的地方輸入?yún)?shù)名的需要。
例如,假設(shè)要計算兩個節(jié)點的平均X位置。使用*GET命令,參數(shù)L1可以指定節(jié)點1的X位置,參數(shù)L2可以指定節(jié)點2的X位置。然后,可以從mid=(L1+L2)/2計算mid位置:
*GET,L1,NODE,1,LOC,X
*GET,L2,NODE,2,LOC,X
MID=(L1+L2)/2
但是,使用返回節(jié)點N的X位置的節(jié)點位置“get ”函數(shù)NX(N),可以直接計算MID,而不需要中間參數(shù)L1和L2:
MID=(NX(1)+NX(2))/2
除非另有說明,否則Get函數(shù)返回活動坐標系中的值。
Get函數(shù)參數(shù)本身可能是參數(shù)或其他Get函數(shù)。get函數(shù)NELEM(E,NPOS)返回元素編號E的NPOS位置的節(jié)點號。組合函數(shù)NX(NELEM(E,NPOS))返回該節(jié)點的X位置。
下表列出了按功能分組的可用get函數(shù)。*GET命令還列出GET函數(shù)作為*GET items的替代項(如果適用)
Table 1: *GET - Get Function Summary
"Get Function" Summary
Entity Status Get Function Description
NSEL(N) Status of node N: -1=unselected, 0=undefined, 1=selected.
ESEL(E) Status of element E: -1=unselected, 0=undefined, 1=selected.
展開