ANSYS二次开发培训练习题 E使用UDL在 ANSYS主菜单中増加一个菜单项,点击后可以出现一个子菜单或激活一个对话框。 APDL E.使用APDL编制一个可以读写有限元模型的小程序,要求读出所有节点号和单元号,节点坐标以 及单元节点列表。 E.使用 DNSOL, DESOL定义计算结果 E_使用 ANSYS列表命令列出 ANSYS某一结果文件的内容:编译并连接 ANSYS二进制文件读写程序 BⅠ NISTE,读写二进制文件并与列表方式相比较。 E.编译并连接 ANSYS提供的示例程序USER0IF;在 ANSYS命令行中使 用/UCMD给用户命令赋新的 名称,并运行。 E.编译并连接 ANSYS提供的示例程序USER03F,使用动态数组保存有限元模型信息,如节点号、 单元号、节点坐标、单元节点列表。使用UP读写教椐库子程序,读写模型中的有限元模型信息和 载荷信息,并打印。 E.使用 ANSYS提供子程序试验矢量与矩阵的操作 E.试验用户自定义材料 E.试验用户单元 E.使用/ DEBUG命令调试 ANSYS单元矩阵及载荷矢量 练习题答案: 说明: 1.以下练习答案以 ANSYS5.5.1UP199810001 Windows9s/8NT的 University Low版本(产品号 为 ansysul)为例,其它版本与此类似 2.假定机器中已经安装了 Digital visual fortran50C以上的版本 假设 ANSYS安装目录为 C- ANSYS55 3.假设用户工作目录为 D: user 4.约定 OS提 D: \user> DOS输入 copy c: \ansys 55\ docu\UIFUNC2GRN ANSYS输入框E1,42 数据文件 I: N Men Training UIDL E.使用UIDL在 ANSYS主菜单中增加一个菜单项,点击后可以出现一个子菜单或激活一个对话 1.拷贝文件 D: \user>copy c: \ansys 55 \docu \menulist55ans D: \user>copy c: \ansys 55\docu \UIMENU GRN D:\user>copy c: \ansys 55 \docu \UIFUNCIGRN
ANSYS 二次开发培训练习题 UIDL E.使用UIDL在ANSYS主菜单中增加一个菜单项,点击后可以出现一个子菜单或激活一个对话框。 APDL E. 使用APDL编制一个可以读写有限元模型的小程序,要求读出所有节点号和单元号,节点坐标以 及单元节点列表。 E. 使用DNSOL,DESOL定义计算结果 UPF E. 使用ANSYS列表命令列出ANSYS某一结果文件的内容;编译并连接ANSYS二进制文件读写程序 BINTST.F,读写二进制文件并与列表方式相比较。 E. 编译并连接ANSYS提供的示例程序USER01.F;在ANSYS命令行中使用/UCMD给用户命令赋新的 名称,并运行。 E. 编译并连接ANSYS提供的示例程序USER03.F,使用动态数组保存有限元模型信息,如节点号、 单元号、节点坐标、单元节点列表。使用UPF读写数据库子程序,读写模型中的有限元模型信息和 载荷信息,并打印。 E. 使用ANSYS提供子程序试验矢量与矩阵的操作 E. 试验用户自定义材料 E. 试验用户单元 E. 使用/DEBUG命令调试ANSYS单元矩阵及载荷矢量 练习题答案: 说明: 1. 以下练习答案以 ANSYS 5.5.1 UP199810001 Windows 95/98/NT 的 University Low 版本(产品号 为 ansysul)为例,其它版本与此类似。 2. 假定机器中已经安装了 Digital Visual Fortran 5.0C 以上的版本 假设 ANSYS 安装目录为 C:\ANSYS55 3. 假设用户工作目录为 D:\user 4. 约定 DOS 提示 D:\user> DOS 输入 copy c:\ansys55\docu\UIFUNC2.GRN ANSYS 输入框 ET,1,42 数据文件 :N Men_Training UIDL E. 使用 UIDL 在 ANSYS 主菜单中增加一个菜单项,点击后可以出现一个子菜单或激活一个对话框。 A. 1. 拷贝文件 D:\user>copy c:\ansys55\docu\menulist55.ans D:\user>copy c:\ansys55\docu\UIMENU.GRN D:\user>copy c:\ansys55\docu\UIFUNC1.GRN
D: \user>copy c: \ansys 55 \docu \UTFUNC2GRN 2.在主菜单中加入自定义菜单项 D: \user>edit UIMENU GRN 在第4780应为 A Main Menu 在第4803行插入以下几行 Menu Training Sep 所得到的结果如下 Men Aux12 nstat K LN(BETA) K LN(BETA) Enc UN DO Sep Men Training Se Enc FINISH 将光标移至第4812行,插入以下一段 N Men Training 413 330 A Training Menu D ANsYs Training MENU Enc Training E END 删除该行 X工 NDEX ADDED BY ANSYS 以后的全部行 存盘退出 3.编辑新的菜单文件 D: \user>edit newmenu grn 键入以下文字 E UIMENU GRN D Modified on 98/10/01, Revision (SID)=5.1811.68- For use with ANSYS 759, :N Enc Training S627,449,170
D:\user>copy c:\ansys55\docu\UIFUNC2.GRN 2. 在主菜单中加入自定义菜单项 D:\user>edit UIMENU.GRN 在第 4780 应为 :A Main Menu 在第 4803 行插入以下几行: Menu_Training Sep_ 所得到的结果如下: Men_Aux12 Men_RunStat K_LN(BETA) Sep_ K_LN(BETA) Fnc_UNDO Sep_ Men_Training Sep_ Fnc_FINISH 将光标移至第 4812 行,插入以下一段 :! :N Men_Training :S 413, 76, 330 :T Menu :A Training Menu :D ANSYS Training MENU Fnc_Training :E END :! 删除该行 :X INDEX ADDED BY ANSYS 以后的全部行 存盘退出 3. 编辑新的菜单文件 D:\user>edit newmenu.grn 键入以下文字 :F UIMENU.GRN :D Modified on 98/10/01, Revision (SID) = 5.181.1.68 - For use with ANSYS 5.5 :I 1, 759, 809 :! :N Fnc_Training :S 627, 449, 170 :T Command
A ANsYs Customizing Training D Training Exercises C )*GET, Zl, ACTIvE,, TITLE,, START c )*GET, z2, ACTIVE,, TITLE,, START,9 c )*GET, z3, ACTIVE,, TITLE,, START, 17 c )*GET, z4, ACTIVE,, TITLE,, START, 25 c )*GET, z5, ACTIVE,, TITLE,, START,33 c)*geT, z6 ACtive TITLE,, START,41 c )*GeT, z7, Active TI TLE,, START,49 C )*GET, z8, ACTIVE, TITLE,, START, 57 c)*geT, z9, ACTIVE, TITLE, START,65 Inp NoApply nd )/NO Cmd )/TITLE Fld 2 Prm [/TITLE] Welcome to ANsYS Training Typ Char, 72, 72 Prm [/TITLE] Welcome to ANSYS Training Cmd )/Go 存盘退出 4.修改 menulist55ans文件 D: \user>edit menulist55ans 修改文件的前三行,使其指向用户工作目录下的文件 d: \user\UIMENU GRN d: \user\UIFUNC1 GRN d: \user\UIFUNC2 GRN d: \user \newmenu. grn c:\ans ys 55\ DOCU\UICMDS HLP c:\ans ys 55\DOCU\UIELEM HLP c:\ans ys 55\ DOCU\UIGUI D. HLP c:\ans ys 55\ DOCU\UITHRY HLP c: \ans ys 55\ DOCU\UIOTHRHLP 5.启动 ANSYS的 launcher 在 Working Directory框中键入 d:\user 按OK键,启动 ANSYS界面 APDL E.使用APDL编制一个可以读写有限元模型的小程序,要求读出所有节点号和单元号,节点坐标以
:A ANSYS Customizing Training :D Training Exercises :C )*GET,_z1,ACTIVE,,TITLE,,START,1 :C )*GET,_z2,ACTIVE,,TITLE,,START,9 :C )*GET,_z3,ACTIVE,,TITLE,,START,17 :C )*GET,_z4,ACTIVE,,TITLE,,START,25 :C )*GET,_z5,ACTIVE,,TITLE,,START,33 :C )*GET,_z6,ACTIVE,,TITLE,,START,41 :C )*GET,_z7,ACTIVE,,TITLE,,START,49 :C )*GET,_z8,ACTIVE,,TITLE,,START,57 :C )*GET,_z9,ACTIVE,,TITLE,,START,65 Fmt_H Inp_NoApply Cmd_)/NOPR Cmd_)/TITLE Fld_2 Prm_[/TITLE] Welcome to ANSYS Training Typ_Char,72,72 Prm_[/TITLE] Welcome to ANSYS Training Cmd_)/Go :E END :! 存盘退出 4. 修改 menulist55.ans 文件 D:\user>edit menulist55.ans 修改文件的前三行,使其指向用户工作目录下的文件 d:\user\UIMENU.GRN d:\user\UIFUNC1.GRN d:\user\UIFUNC2.GRN d:\user\newmenu.grn c:\ansys55\DOCU\UICMDS.HLP c:\ansys55\DOCU\UIELEM.HLP c:\ansys55\DOCU\UIGUID.HLP c:\ansys55\DOCU\UITHRY.HLP c:\ansys55\DOCU\UIOTHR.HLP 5. 启动 ANSYS 的 launcher 在 Working Directory 框中键入 d:\user 按 OK 键,启动 ANSYS 界面 APDL E. 使用 APDL 编制一个可以读写有限元模型的小程序,要求读出所有节点号和单元号,节点坐标以
及单元节点列表。 编辑文件adat D: \user>edit a dat *Get nnod, NoDe,0, COUNT 大Dim, nodes, array Getr nd, Node,O, NUM, MIN nodes(I)= nd xy(I, 1)=Nx(nd) nd Ndnext(nd) Enddo *Get, nelm, elem,o, CounT 大Dim, e lems ay, nelm *Dim, ndlst, array, nelm, 4 *Getrel, elem,o, NUM, MIN elems(工)=e1 大Do,J,1,4 dlst(I, J)=Elem(el,J 2.启动 ANSYS,根据自己所熟悉的领域,建立一个有限元模型 3.输入文件adat /input,a,dat 4.检查 分别列出节点数,节点号列表,坐标,单元数,单元号列表,单元节点列表,与 list. elist等对比。 ★ status,mnod status, nodes ★ status,xY *status, elems *status, ndi st E.使用 DNSOL, DESOL定义计算结果 利用前面所建立或新建一个有限元模型
及单元节点列表。 A. 1. 编辑文件 a.dat D:\user>edit a.dat *Get,nnod,NODE,0,COUNT *Dim,xy,array,nnod,2 *Dim,nodes,array,nnod *Get,nd,NODE,0,NUM,MIN *Do,I,1,nnod,1 nodes(I)= nd xy(I,1) = Nx(nd) xy(I,2) = Ny(nd) nd = Ndnext(nd) *Enddo *Get,nelm,ELEM,0,COUNT *Dim,elems,array,nelm *Dim,ndlst,array,nelm,4 *Get,el,ELEM,0,NUM,MIN *Do,I,1,nelm,1 elems(I)= el *Do,J,1,4 ndlst(I,J) = Nelem(el,J) *Enddo el = Elnext(nd) *Enddo 2. 启动 ANSYS,根据自己所熟悉的领域,建立一个有限元模型 3. 输入文件 a.dat /input,a,dat 4. 检查 分别列出节点数,节点号列表,坐标,单元数,单元号列表,单元节点列表,与 nlist,elist 等对比。 *status,nnod *status,nodes *status,xy *status,nelm *status,elems *status,ndlst E. 使用 DNSOL,DESOL 定义计算结果 1. 利用前面所建立或新建一个有限元模型
2.进入Post- processor Main Menu->General Postproc 3.定义节点上的结果 手工定义 > Nodal results按对话框提示输入各点的结果数据 程序自动定义 /PREP7 BLC4,0,0,4,2 et,1,42 esizer. 5 amesh 1 /POST1 dof, temp *Ge tr nnod, Node,0, COUNT *Dim, xy, array, nnod, 2 *Dim, nodes, array, nnod *Get, nd, NoDE,O, NUM, MIN Do,I, l, nnod, xy(I, 1)=Nx(nd) xy(I, 2)= Ny(nd) nd Ndnext (nd) 大 Enddo *Do,i,l nnod, 1 dist=sqrt((xy(i,1)-2)*(xy(i,1)-2)+(xy(i,2)-1)*(xy(i,2)-1)) p= dist*100 Dnsol, nodes (i),temp,, tmp nsel all plnsol, temp
2. 进入 Post-processor /post26 或 Main Menu->General Postproc 3.定义节点上的结果 手工定义 ->Nodal Results 按对话框提示输入各点的结果数据 程序自动定义 /PREP7 BLC4,0,0,4,2 et,1,42 esize,.5 amesh,1 /POST1 dof,temp *Get,nnod,NODE,0,COUNT *Dim,xy,array,nnod,2 *Dim,nodes,array,nnod *Get,nd,NODE,0,NUM,MIN *Do,I,1,nnod,1 nodes(I)= nd xy(I,1) = Nx(nd) xy(I,2) = Ny(nd) nd = Ndnext(nd) *Enddo *Do,i,1,nnod,1 dist = sqrt((xy(i,1)-2)*(xy(i,1)-2)+(xy(i,2)-1)*(xy(i,2)-1)) tmp = dist*100 Dnsol,nodes(i),temp,,tmp *Enddo nsel,all plnsol,temp
UPF E.使用 ANSYS列表命令列出 ANSYS某一结果文件的内容;编译并连接 ANSYS二进制文件读写 程序 BINTSTF,读写二进制文件并与列表方式相比较。 建立一个自己所熟悉的有限元模型,单元数3~5即可,加载、设置边界条件并求解 6.使用 ANSYS列表命令 Utility Menu->File->List->Binary File 7.在弹出的对话框中 DUMP] Records to be list中选 ALL Records ORM] Amt of output per record中选 Entire Records ILEAUX2] binary file to list中选择要显示的rst文件 按OK键确认后,可以得到rst文件的列表窗口 使用列表窗口的菜单保存列表窗口中的输出结果到文件 list txt File->Save as 8.拷贝以下文件到工作目录 D: \user>copy c: \ ansys 55 custom \misc \intel \bintstf D: \user>copy c: \ansys 55 \custom \misc \intel bintrdf D: \user>copy c: \ansys 55 \custom \misc lintel \bintwrf D: \user>copy c: \ansys 55 custom misc \intel \Cus tom.bat D: \user>copy c: \ansys 55 \custom misc \intel \ Makefile D: \user>copy c: \ ansys 55 \custom \misc \intel \binliba 9.运行 Custom.bat,编译并连接 D: \user>cus tom 在工作目录中可生成一个运行程序 bintst exe 10.运行 bintst exe D: \user>bintst>out.txt 将 hints的运行结果转存到文件 out. txt中 比较out与istt文件中的结果,并参考手册 Guide to interfacing to ANSYS中 Format of Binary Data files的 Format of the results file分析文件结构。 E.用户命令:编译并连接 ANSYS提供的示例程序USER01F:在 ANSYS命令行中使用/CMD给 用户命令赋新的名称,并运行 1.清理用户工作目录下的文件 如果在用户工作目录下存在 ANSYS二进制文件读取等程序,请全部删除 2.拷贝以下文件到用户工作目录 D:\user>copy c: \ansys 55 \custom luser \intel luser01F D: \user>copy c: \ansys 55 \custom \ lintel \Anscustbat D: \user>copy c: \ansys 55 \ luser \intel IMakefile 1.修改user01.F 修改以下几行 大大大大大 users CO DE IS INSERTED HErE大大大★大 write (iott, 2000) 2000 format(//!*大★大* CALL TO ANSYS, INC DUMMY USER01*大*★★’//)
UPF E. 使用 ANSYS 列表命令列出 ANSYS 某一结果文件的内容;编译并连接 ANSYS 二进制文件读写 程序 BINTST.F,读写二进制文件并与列表方式相比较。 1. 建立一个自己所熟悉的有限元模型,单元数 3~5 即可,加载、设置边界条件并求解 6. 使用 ANSYS 列表命令 Utility Menu->File->List->Binary File 7. 在弹出的对话框中 [DUMP] Records to be list 中选 ALL Records [FORM] Amt of output per record 中选 Entire Records [FILEAUX2] binary file to list 中选择要显示的.rst 文件 按 OK 键确认后,可以得到.rst 文件的列表窗口 使用列表窗口的菜单保存列表窗口中的输出结果到文件 list.txt File->Save As 8. 拷贝以下文件到工作目录 D:\user>copy c:\ansys55\custom\misc\intel\bintst.f D:\user>copy c:\ansys55\custom\misc\intel\bintrd.f D:\user>copy c:\ansys55\custom\misc\intel\bintwr.f D:\user>copy c:\ansys55\custom\misc\intel\Custom.bat D:\user>copy c:\ansys55\custom\misc\intel\Makefile D:\user>copy c:\ansys55\custom\misc\intel\binlib.a 9. 运行 Custom.bat,编译并连接 D:\user>custom 在工作目录中可生成一个运行程序 bintst.exe 10. 运行 bintst.exe D:\user>bintst > out.txt 将 bintst 的运行结果转存到文件 out.txt 中 比较 out.txt 与 list.txt 文件中的结果,并参考手册 Guide to interfacing to ANSYS 中 Format of Binary Data Files 的 Format of the Results File 分析文件结构。 E. 用户命令:编译并连接 ANSYS 提供的示例程序 USER01.F;在 ANSYS 命令行中使用/UCMD 给 用户命令赋新的名称,并运行。 1. 清理用户工作目录下的文件 如果在用户工作目录下存在 ANSYS 二进制文件读取等程序,请全部删除 2. 拷贝以下文件到用户工作目录 D:\user>copy c:\ansys55\custom\user\intel\user01.F D:\user>copy c:\ansys55\custom\user\intel\Anscust.bat D:\user>copy c:\ansys55\custom\user\intel\Makefile 1. 修改 user01.F 修改以下几行 c c ***** user'S CODE IS INSERTED HERE ***** write (iott,2000) 2000 format (//' ***** CALL TO ANSYS,INC DUMMY USER01 *****'//)
C 大大大大大 do not return this result code in a rea1 user rout ine user01=-654321 大大大大 instead return a zero大 为 大大大大大 user s CO DE IS INSERTED HERE大★大大大 write (iott, 2000) 2000 format (/ wby*** CALL TO AN SYS, INC DUMMY USER01 ***** // cccc 大★ do not return this result code in a rea1user ★★大大大 instead return a zero★大大大★ user01= 0 在 format语句中增加的字符是为了在 ANSYS运行时表明uero1F确实是自己修改过的版本 将 user1的值设成0,是为了使 ANSYS给出正确信息,而不是警告 修改 ansys.55dir的值使其指向 ANSYS主目录 ansys55 dirC: \ansys55 修改下面这一行 siappst lib 为 S(ansys55 dir)\customliblintellsiappst lib I 3.运行 ANSCUSTBAT编译并连接 忽略掉如下 WARNING提示信息 LINK: warning LNK4049: locally defined symbol "free"imported LINK: warning LNK4049: locally defined symbol "malloc"imported LINK: warning LNK4049: locally defined symbol "fflush" imported LINK: warning LNK4049: locally defined symbol "fread"imported LINK: warning LNK4049: locally defined symbol "fwrite"imported LINK: warning LNK4049: locally defined symbol"ftell"imported LINK: warning LNK4049: locally defined symbol "fseek"imported 当出现 goto end时表明编译、连接完成,这时应该在用户工作目录下出现一个可执行程序 ansys. exe, 约为34MB 4.运行编译连接生成的 ANSYS 在用户工作目录下 D: \user>ansys -p ansysul
c c ***** do not return this result code in a real user routine user01 = -654321 c ***** instead return a zero ***** c user01 = 0 c 为 c c ***** user'S CODE IS INSERTED HERE ***** write (iott,2000) 2000 format (//' wby*** CALL TO ANSYS,INC DUMMY USER01 *****'//) c c ***** do not return this result code in a real user c user01 = -654321 c ***** instead return a zero ***** user01 = 0 c 在 format 语句中增加的字符是为了在 ANSYS 运行时表明 user01.F 确实是自己修改过的版本 将 user01 的值设成 0,是为了使 ANSYS 给出正确信息,而不是警告 2. 修改 Makefile 修改 ansys55_dir 的值使其指向 ANSYS 主目录 ansys55_dir=C:\ansys55 修改下面这一行 siappst.lib \ 为 $(ansys55_dir)\custom\lib\intel\siappst.lib \ 3. 运行 ANSCUST.BAT 编译并连接 忽略掉如下 WARNING 提示信息 LINK : warning LNK4049: locally defined symbol "_free" imported LINK : warning LNK4049: locally defined symbol "_malloc" imported LINK : warning LNK4049: locally defined symbol "_fflush" imported LINK : warning LNK4049: locally defined symbol "_fread" imported LINK : warning LNK4049: locally defined symbol "_fwrite" imported LINK : warning LNK4049: locally defined symbol "_ftell" imported LINK : warning LNK4049: locally defined symbol "_fseek" imported 当出现 goto end 时表明编译、连接完成,这时应该在用户工作目录下出现一个可执行程序 ansys.exe, 约为 34MB 4. 运行编译连接生成的 ANSYS 在用户工作目录下 D:\user>ansys -p ansysul
或 D: \user>ansys 55cust -custom . \ansys. exe -p ansysul 如果在其它目录下运行 D: \otherdir>set path=c: \ansys55\bin lintel D: \otherdir>ansys55cust -cus tom d: \ ansys. exe -p ansysul D: \otherdir>set path=d: luser D: \otherdir>ansys -p ansysul 5.执行用户命令 执行用户命令可以在字符界面下,也可在图形界面下 在出现 BEGIN: 提示信息后,键入以下命令 usr1 或者输入以下命令进行到图形用户界面 /show, win32 /menu, on 在工作站上的用户可以选择 /show, x11 /show, xiC 详细说明可以参见 ANSYS命令手册中关于/show的说明 在输入框中,键入命令 sr1 6.用/CMD命令自定义用户命令名 在 ANSYS BEGIN提示信息后 UCMD, aaa, 1 aaa E.编译并连接 ANSYS提供的示例程序USER03F,使用动态数组保存有限元模型信息,如节点号、 单元号、节点坐标、单元节点列表。使用UPF读写数据库子程序,读写模型中的有限元模型信息和 载荷信息,并打印。 以下是一个完整的程序,可由user03F修改得到 大deck,user03 ANSYS, INC c sid 5. 1 copy of file s. user03F last changed by jtm on 98/03/09 function user03 (intin, dpin, chin, chain) include impcom inc external wring, ndingr, ndgxyz, ndnext, HeapAllocPtr, HeapDealloc, erhandle integer wring, ndingr, ndgxyz, ndnext, HeapAllocPtr
或 D:\user>ansys55cust -custom .\ansys.exe -p ansysul 如果在其它目录下运行 D:\otherdir>set path=c:\ansys55\bin\intel D:\otherdir>ansys55cust -custom d:\user\ansys.exe -p ansysul 或 D:\otherdir>set path=d:\user D:\otherdir>ansys -p ansysul 5. 执行用户命令 执行用户命令可以在字符界面下,也可在图形界面下 在出现 BEGIN: 提示信息后,键入以下命令 usr1 或者输入以下命令进行到图形用户界面 /show,win32 /menu,on 在工作站上的用户可以选择 /show,x11 /show,x11c /show,3D 详细说明可以参见 ANSYS 命令手册中关于/show 的说明 在输入框中,键入命令 usr1 6. 用/UCMD 命令自定义用户命令名 在 ANSYS BEGIN 提示信息后 /UCMD,aaa,1 aaa E. 编译并连接 ANSYS 提供的示例程序 USER03.F,使用动态数组保存有限元模型信息,如节点号、 单元号、节点坐标、单元节点列表。使用 UPF 读写数据库子程序,读写模型中的有限元模型信息和 载荷信息,并打印。 以下是一个完整的程序,可由 user03.F 修改得到 *deck,user03 user ANSYS,INC c sid 5.1 copy of file s.user03.F last changed by jtm on 98/03/09 function user03 (intin,dpin,ch4in,ch8in) #include "impcom.inc" external wrinqr,ndinqr,ndgxyz,ndnext,HeapAllocPtr, x HeapDealloc,erhandler integer wrinqr,ndinqr,ndgxyz,ndnext,HeapAllocPtr
integer user03, intin(12),iott, i, ksel, xcptr, hXcptr, ycptr, hY cpt cptr, hz cpt dptr, hNdptr, nun double precision dpin(12), xyz (3), xmean, ymean, zmean, stdxyz(3), sod, sody, sodz character*4 chin(12 character*8 chain(12 #include "ans ysdef inc Get nodal xyz locations and calculate standard deviation of x coordinates, y coordinates, &z coordinates get number of currently selected node numnp ndingr (0, DB NUMSELECTED) if (numnp le. 0) allocate memory for x, y,&z coordinates of no des xcptr =HeapAllocPtr(numnp,'XCoords HEAP DOUBLE, hXcptr ycptr HeapAllocPtr (numnp, ' YCoords HEAP DOUBLE, hYcptr) zcptr HeapAllocPtr(numnp, 'COords HEAP DOUBLE, hZcptr ndptr HEapAllocPtr(numnp,Nodes ' HEAP INTEGER, hNdptr loop through all selected nodes node mean =0 yme an =0.0d0 zmean =0.0d0 10 node ndnext(node if (node gt. 0)then ksel= ndgxyz (node, xyz(1) stack(xcptr +i)= xyz(1/ Qinates store this node's xyz coor dstack(ycptr i)=xyz(2) stack(zcptr i)=xyz(3) istack(ndptr i)= node
integer user03, intin(12), iott, i, ksel, xcptr, hXcptr, ycptr, x hYcptr, zcptr, hZcptr, ndptr, hNdptr, numnp, node double precision dpin(12),xyz(3), xmean, ymean, zmean, stdxyz(3), x sodx, sody, sodz character*4 ch4in(12) character*8 ch8in(12) #include "ansysdef.inc" #include "stack.inc" c c Get nodal xyz locations and calculate standard deviation of c x coordinates, y coordinates, & z coordinates c c get number of currently selected nodes numnp = ndinqr (0,DB_NUMSELECTED) if (numnp .le. 0) go to 999 c allocate memory for x, y, & z coordinates of nodes xcptr = HeapAllocPtr(numnp,'XCoords ',HEAP_DOUBLE,hXcptr) ycptr = HeapAllocPtr(numnp,'YCoords ',HEAP_DOUBLE,hYcptr) zcptr = HeapAllocPtr(numnp,'ZCoords ',HEAP_DOUBLE,hZcptr) ndptr = HEapAllocPtr(numnp,'Nodes ',HEAP_INTEGER,hNdptr) c loop through all selected nodes i=1 node = 0 xmean = 0.0d0 ymean = 0.0d0 zmean = 0.0d0 10 node = ndnext(node) if (node .gt. 0) then c get xyz coordinates ksel = ndgxyz (node,xyz(1)) c store this node's xyz coordinates dstack(xcptr + i) = xyz(1) dstack(ycptr + i) = xyz(2) dstack(zcptr + i) = xyz(3) istack(ndptr + i) = node
while we're looping, accumulate sums to calculate means n=xmean xyz(1) me n= mean xyz(2) n=zmean xyz(3) ncrement index i=i+1 loop back up for next selected node goto 1 endif call wrdisp (numnp, istack(ndptr+1)) node =0, at the end of node list c calculate mean of xyz coordinates xme an /numnp yme an ymean numnp zme an zmean numnp calculate standard deviation for xyz coordinates sod =0 sody =0 0 dy sody (stack(ycptr+i)- yean)* odz +(stack(zcptr+i enddo stdxyz(1)= sqrt(sodx /(numnp-1)) stdxyz (2)= sqrt(sody /(numnp-1)) tdxyz(3) grt(sodz /(numnp-1)) C大大大★大 write to output fi1e*★★大 iott wring(WR OUT PUT write (iott, 2000) stdxyz(1), stdxyz(2), stdxyz(3) 000 format ( STD FOR X COORDINATES: ' G125,/, Ⅹ STD FOR Y COORDINATES: , G12.5,/ 1 STD FOR Z COORD INATES: ',G12. 5)
c while we're looping, accumulate sums to calculate means xmean = xmean + xyz(1) ymean = ymean + xyz(2) zmean = zmean + xyz(3) c increment index i = i + 1 c loop back up for next selected node goto 10 endif call wrdisp (numnp, istack(ndptr+1)) c node = 0, at the end of node list c calculate mean of xyz coordinates xmean = xmean / numnp ymean = ymean / numnp zmean = zmean / numnp c calculate standard deviation for xyz coordinates sodx = 0 sody = 0 sodz = 0 do i=1, numnp sodx = sodx + (dstack(xcptr+i) - xmean)**2 sody = sody + (dstack(ycptr+i) - ymean)**2 sodz = sodz + (dstack(zcptr+i) - zmean)**2 enddo stdxyz(1) = sqrt(sodx / (numnp-1)) stdxyz(2) = sqrt(sody / (numnp-1)) stdxyz(3) = sqrt(sodz / (numnp-1)) c ***** write to output file ***** iott = wrinqr(WR_OUTPUT) write (iott,2000) stdxyz(1),stdxyz(2),stdxyz(3) 2000 format (/' STD FOR X COORDINATES:',G12.5,/, X ' STD FOR Y COORDINATES:',G12.5,/, X ' STD FOR Z COORDINATES:',G12.5)