仿¥ã
FEMã¯ãããããå¿çšå·¥åŠã®åºç¯ãªåé¡ã解決ããããã®æãäžè¬çãªæ¹æ³ã§ãã æŽå²çã«ã圌ã¯ååŠããåºãŠããŸãããããã®åŸãããããçš®é¡ã®éæ©æ¢°çãªåé¡ã«é©çšãããŸããã
çŸåšã
ANSYS ã
Abaqus ã
Patran ã
Cosmosãªã©ãããŸããŸãªãœãããŠã§ã¢ããã±ãŒãžããããŸãã ãããã®ãœãããŠã§ã¢ããã±ãŒãžã䜿çšãããšãæ§é ååŠãæµäœååŠãç±ååŠã黿°ååŠãªã©ã®å€ãã®åé¡ã解決ã§ããŸãã ååãšããŠãã¡ãœããèªäœã®å®è£
ã¯éåžžã«è€éã§èšå€§ãªãã®ãšèŠãªãããŸãã
ããã§ãçŸæç¹ã§ã¯ãææ°ã®ããŒã«ã䜿çšããŠã2次å
ã®å¹³é¢å¿åç¶æ
ã®åé¡ã«å¯ŸããŠæãç°¡åãªFEMé»åããŒãããäœæããããšã¯ãããã»ã©è€éã§é¢åã§ã¯ãªãããšã瀺ããããšæããŸãã ãã®çš®ã®ã¿ã¹ã¯ãéžãã ã®ã¯ãæéèŠçŽ æ³ãé©çšããæåã®æåäŸã ã£ãããã§ãã ãããŠãã¡ãããæãç°¡åã«å®è£
ã§ããŸãã 以äžã«ç€ºãããã«ãããã¯æ°å€ç©åãå¿
èŠãšããªãå¯äžã®ãã©ããèŠçŽ ã§ãããããç·åœ¢ã®3ããŒãèŠçŽ ã䜿çšããŸãã çµ±åæäœïŒå®å
šã«ç°¡åãªããã§ã¯ãããŸãããããã®å®è£
ã¯éåžžã«è峿·±ãïŒãé€ããŠã髿¬¡ã®èŠçŽ ã«ã€ããŠã¯ãèãæ¹ã¯ãŸã£ããåãã§ãã
泚ç®ãéããç»åïŒ

æŽå²çã«ãFEMã®æåã®å®çšçãªå¿çšã¯ååŠã®åéã§ãããçšèªãšã¡ãœããã®æåã®è§£éã«å€§ããªåœ±é¿ãäžããŸããã æãåçŽãªå Žåããã®æ¹æ³ã®æ¬è³ªã¯æ¬¡ã®ããã«èª¬æã§ããŸããé£ç¶åªäœã¯åçã®ãã³ãžã·ã¹ãã ã«çœ®ãæããããéçã«äžç¢ºå®ãªã·ã¹ãã ã®è§£æ±ºçã¯ããç¥ãããç ç©¶ãããŠããååŠã®åé¡ã§ãã ãã®åçŽåãããå·¥åŠçè§£éã¯ããã®æ¹æ³ã®æ®åã«è²¢ç®ããŸããããå³å¯ã«èšãã°ããã®ãããªæ¹æ³ã®çè§£ã¯æ£ãããããŸããã ã¡ãœããã®æ£ç¢ºãªæ°åŠçæ£åœåã¯ãã¡ãœããã®æåã®æåããã¢ããªã±ãŒã·ã§ã³ããããã£ãšåŸã«äžããããŸããããããã«ãããååŠã®åéã ãã§ãªããããåºç¯ãªåé¡ã®ç¯å²ãæ¡å€§ããããšãã§ããŸããã
ã¡ãœããã®è©³çްã«ã€ããŠã¯èª¬æããŸããããããã«é¢ããå€ãã®æç®ããããŸããã代ããã«ã¡ãœããã®å®è£
ã«çŠç¹ãåœãŠãŸãã ã¡ã«ããã¯ã®æå°éã®ç¥èããŸãã¯åããœããããããå¿
èŠã§ãã ãŸããå°ãªããšãã¢ã€ãã¢ãæç¢ºã§ãã£ããã©ããã«é¢ä¿ãªããã¡ã«ããã¯ã«é¢ä¿ã®ãªã人ã
ã®ã¬ãã¥ãŒãåãã§ããŸãã ãã®ã¡ãœããã¯C ++ã§å®è£
ãããŸããããã®èšèªã®ç¹å®ã®æ©èœã¯äœ¿çšããããã®èšèªãç¥ããªã人ã«ãã³ãŒããçè§£ã§ããããšãæã¿ãŸãã
ããã¯ã¡ãœããã®å®è£
ã®äžäŸã«ãããªãããããã¹ãŠãè€éã«ãããçè§£ããããã«ãã¹ãŠãæãåçŽãªåœ¢ã®ãŸãŸã«ããŠããããã«ãå€ãã®ããã°ã©ãã³ã°ååãæãªããããç°¡æœã«ããããšæããŸãã ããã¯ãåªããä¿å®å¯èœãªä¿¡é Œã§ããã³ãŒããèšè¿°ããäŸã§ã¯ãªããFEMãå®è£
ããäŸã§ãã ãããã£ãŠãäž»ãªç®æšã«éäžããããã«å€ãã®ç°¡ç¥åããããŸãã
å
¥åããŒã¿
ã¡ãœããèªäœãéå§ããåã«ãå
¥åããŒã¿ãã©ã®åœ¢åŒã§è¡šç€ºãããã確èªããŸãããã åé¡ã®ãªããžã§ã¯ãã¯ã倿°ã®å°ããªèŠçŽ ããã®å Žåã¯äžè§åœ¢ã«åå²ããå¿
èŠããããŸãã ãããã£ãŠãé£ç¶åªäœããã°ãªããã圢æããããŒããšæéèŠçŽ ã®ã»ããã§çœ®ãæããŸãã 以äžã®å³ã¯ãçªå·ä»ãã®ããŒããšèŠçŽ ãæã€ã°ãªããã®äŸã瀺ããŠããŸãã

å³ã§ã¯ã9ã€ã®ããŒããš8ã€ã®èŠçŽ ã衚瀺ãããŠããŸãã ã°ãªããã説æããã«ã¯ã2ã€ã®ãªã¹ããå¿
èŠã§ãã
- åããŒãã®åº§æšãå®çŸ©ããããŒãã®ãªã¹ãã
- ã¢ã€ãã ã®ãªã¹ãã
èŠçŽ ã®ãªã¹ãã§ã¯ãåèŠçŽ ã¯èŠçŽ ã圢æããããŒãã®ã€ã³ããã¯ã¹ã®ã»ããã«ãã£ãŠæ±ºå®ãããŸãã ç§ãã¡ã®å Žåãäžè§åœ¢ã®èŠçŽ ããæã£ãŠããªããããåèŠçŽ ã«äœ¿çšããã€ã³ããã¯ã¹ã¯3ã€ã ãã§ãã
äŸãšããŠãäžèšã®ã°ãªããã®å Žåãæ¬¡ã®ãªã¹ãããããŸãã
ããŒãã®ãªã¹ãïŒ
0.000000 31.500000 15.516667 31.500000 0.000000 19.489759 18.804134 23.248226 0.000000 0.000000 20.479981 11.365822 27.516667 19.500000 27.516667 11.365822 27.516667 0.000000
ã¢ã€ãã ã®ãªã¹ãïŒ
1 3 2 2 3 4 4 6 7 4 3 6 7 6 8 3 5 6 6 5 9 6 9 8
åãèŠçŽ ãæå®ããã«ã¯ããã€ãã®æ¹æ³ãããããšã«æ³šæããŠãã ããã ããŒãã€ã³ããã¯ã¹ã¯ãæèšåããŸãã¯åæèšåãã«ãªã¹ãã§ããŸãã éåžžãåæèšåãã®åæã䜿çšãããããããã¹ãŠã®èŠçŽ ããã®æ¹æ³ã§æå®ããããšæ³å®ããŸãã
ã¿ã¹ã¯ã®å®å
šãªèª¬æãå«ãå
¥åãã¡ã€ã«ãäœæããŸãããã æ··ä¹±ãé¿ããŠè€éã«ããªãããã«ãC / C ++é
åã§ã¯ãŒãããã€ã³ããã¯ã¹ãäœæãããããã1ããã§ã¯ãªã0ããå§ãŸãã€ã³ããã¯ã¹ã䜿çšããããšããå§ãããŸãã æåã®ãã¹ãå
¥åãã¡ã€ã«ã§ã¯ãå¯èœãªéãåçŽãªã°ãªãããäœæããŸãã

æåã®è¡ãææç¹æ§ã®èª¬æã«ããŸãã ããšãã°ãéŒã®å Žåããã¢ãœã³æ¯Îœ= 0.3ããã³ã€ã³ã°çE = 2000 MPaïŒ
0.3 2000
次ã«ãããŒãã®æ°ãšããŒãã®ãªã¹ãèªäœã®è¡ãç¶ããŸãã
4 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0
次ã«ãèŠçŽ ã®æ°ãèŠçŽ ã®ãªã¹ããå«ãè¡ãç¶ããŸãã
2 0 1 2 1 3 2
ããã§ããã€ã³ãã£ã³ã°ããŸãã¯åœŒããèšãããã«ã第1çš®ã®å¢çã®æ¡ä»¶ãèšå®ããå¿
èŠããããŸãã ãã®ãããªå¢çæ¡ä»¶ãšããŠãããŒãã®åããä¿®æ£ããŸãã è»žã«æ²¿ã£ãåããäºãã«ç¬ç«ããŠä¿®æ£ã§ããŸãã x軞ãŸãã¯yè»žã«æ²¿ã£ãç§»åããŸãã¯ãã®äž¡æ¹ãäžåºŠã«çŠæ¢ã§ããŸãã äžè¬çãªå Žåãç¹å®ã®åæå€äœãæå®ã§ããŸããããŒãåæå€äœã®ã¿ã«å¶éããŸãã ãããã£ãŠãç¹å®ã®ã¿ã€ãã®ç§»åå¶éãæã€ããŒãã®ãªã¹ããäœæãããŸãã å¶éã®çš®é¡ã¯çªå·ã§ç€ºãããŸãã
- 1-x軞æ¹åã®ç§»åã¯çŠæ¢ãããŠããŸã
- 2-yè»žã®æ¹åãžã®ç§»åã¯çŠæ¢ãããŠããŸã
- 3-xæ¹åãšyæ¹åã®äž¡æ¹ã«ç§»åããããšã¯çŠæ¢ãããŠããŸã
æåã®è¡ã¯ãå¶éã®æ°ãå®çŸ©ããŸãã
2 0 3 1 2
次ã«ãè² è·ãèšå®ããå¿
èŠããããŸãã ããŒãã«ãã©ãŒã¹ã§ã®ã¿åäœããŸãã å³å¯ã«èšãã°ãç¯ç¹ã®åã¯èšèã®äžè¬çãªæå³ã§ã®åãšèŠãªãããã¹ãã§ã¯ãããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãããããŒãã«äœçšããåãšèããŠã¿ãŸãããã ããŒãã€ã³ããã¯ã¹ãšå¯Ÿå¿ããåãã¯ãã«ã®ãªã¹ããå¿
èŠã§ãã æåã®è¡ã¯ãé©çšãããåã®éãæ±ºå®ããŸãã
2 2 0.0 1.0 3 0.0 1.0
æ€èšäžã®åé¡ã¯ãåºé¢ãåºå®ãããäžé¢ã«åŒµåãäœçšããæ£æ¹åœ¢ã®ããã£ã§ããããšã容æã«ããããŸãã

å
¥åãã¡ã€ã«å
šäœïŒ
0.3 2000 4 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 2 0 1 2 1 3 2 2 0 3 1 2 2 2 0.0 1.0 3 0.0 1.0
Eigen-æ°åŠã©ã€ãã©ãª
ã³ãŒããæžãå§ããåã«ãæ°åŠã©ã€ãã©ãª
Eigenã«ã€ããŠã話ããããšæããŸãã éåžžã«ã¯ãªãŒã³ã§è¡šçŸåè±ããªAPIãåãããæçããä¿¡é Œæ§ã®é«ãå¹ççãªã©ã€ãã©ãªã§ãã å€ãã®ã³ã³ãã€ã«ææé©åããããã©ã€ãã©ãªã¯æç€ºçãªãã¯ãã«åãå®è¡ã§ããSSE 2/3/4ãARMããã³NEONåœä»€ããµããŒãããŸãã ç§ã«é¢ããŠèšãã°ããã®ã©ã€ãã©ãªã¯ãç°¡æœã§è¡šçŸåè±ããªæ¹æ³ã§è€éãªæ°åŠèšç®ãå®è£
ã§ãããšããçç±ã ãã§æ³šç®ã«å€ããŸãã
åŸã§äœ¿çšããEigen APIã®äžéšã«ã€ããŠç°¡åã«èª¬æããŸãã ãã®ã©ã€ãã©ãªã«ç²ŸéããŠããèªè
ã¯ããã®ã»ã¯ã·ã§ã³ãã¹ãããã§ããŸãã
è¡åã«ã¯ãå¯ãšçã®2çš®é¡ããããŸãã äž¡æ¹ã®ã¿ã€ãã䜿çšããŸãã å¯è¡åã®å Žåããã¹ãŠã®èŠçŽ ã¯ã€ã³ããã¯ã¹ã®é åºã§ã¡ã¢ãªå
ã«ãããååªå
ïŒããã©ã«ãïŒãšçåªå
ã®äž¡æ¹ã®é
眮ããµããŒããããŸãã ãã®ã¿ã€ãã®è¡åã¯ãæ¯èŒçå°ããè¡åãŸãã¯ãŒãèŠçŽ ã®æ°ãå°ãªãè¡åã«é©ããŠããŸãã ã¹ããŒã¹è¡åã¯ãå°æ°ã®éãŒãèŠçŽ ãæã€å€§ããªè¡åãæ ŒçŽããã®ã«é©ããŠããŸãã ã°ããŒãã«åæ§ãããªãã¯ã¹ã«ã¹ããŒã¹ãããªãã¯ã¹ã䜿çšããŸãã
å¯è¡å
å¯è¡åã䜿çšããã«ã¯ã
<Eigen / Dense>ããããŒãå«ããå¿
èŠããããŸãã å¯è¡åã«ã¯ãåºå®ãšåçã®2ã€ã®äž»ãªã¿ã€ãããããŸãã åºå®ãµã€ãºã®ãããªãã¯ã¹ã¯ãã³ã³ãã€ã«æã«ãµã€ãºãããã£ãŠãããããªãã¯ã¹ã§ãã åçãµã€ãºã®ãããªãã¯ã¹ã®å Žåããã®ãµã€ãºã¯ã³ãŒãå®è¡ã®æ®µéã§èšå®ã§ããããã«åçãããªãã¯ã¹ã®ãµã€ãºã¯ãã®å Žã§å€æŽããããšããã§ããŸãã ãã¡ãããå¯èœãªéãåºå®ãµã€ãºã®è¡åãåªå
ããå¿
èŠããããŸãã åçè¡åã®ã¡ã¢ãªã¯ããŒãã«å²ãåœãŠãããæªç¥ã®è¡åãµã€ãºã¯ã³ã³ãã€ã©ãå®è¡ã§ããæé©åãå¶éããŸãã åºå®ãããªãã¯ã¹ãã¹ã¿ãã¯ã«å²ãåœãŠãããšãã§ããã³ã³ãã€ã©ãŒã¯ã«ãŒããªã©ããããã€ã§ããŸãã è¡åã®è¡æ°ãåºå®ãããŠããããåã®æ°ãåçã§ããå ŽåããŸãã¯ãã®éã®å Žåãæ··ååãå¯èœã§ãã
åºå®ãµã€ãºã®è¡åã¯ã次ã®ããã«å®çŸ©ã§ããŸãã
Eigen::Matrix<float, 3, 3> m;
ããã§ãmã¯3Ã3ã®åºå®ãµã€ãºã®æµ®åå°æ°ç¹è¡åã§ããæ¬¡ã®å®çŸ©æžã¿ã®åã䜿çšã§ããŸãã
Eigen::Matrix2i Eigen::Matrix3i Eigen::Matrix4i Eigen::Matrix2f Eigen::Matrix3f Eigen::Matrix4f Eigen::Matrix2d Eigen::Matrix3d Eigen::Matrix4d
ããã«ããã€ãã®å®çŸ©æžã¿ã®ã¿ã€ãããããŸã;ãããã¯åºæ¬çãªãã®ã§ãã æ°å€ã¯æ£æ¹è¡åã®æ¬¡å
ã瀺ããæåã¯è¡åèŠçŽ ã®ã¿ã€ãã瀺ããŸããiã¯æŽæ°ãfã¯å粟床浮åå°æ°ç¹æ°ãdã¯å粟床浮åå°æ°ç¹æ°ã§ãã
ãã¯ãã«ã®å Žåãåå¥ã®ã¿ã€ãã¯ãããŸããããã¯ãã«ã¯åãè¡åã§ãã åãã¯ãã«ïŒæç®ã§è¡ãã¯ãã«ãèŠã€ããå Žåããããããæç¢ºã«ããå¿
èŠããããŸãïŒã¯ã次ã®ããã«å®£èšã§ããŸãã
Eigen::Matrix<float, 3, 1> v;
ãŸãã¯ãäºåå®çŸ©ãããã¿ã€ãã®ããããã䜿çšã§ããŸãïŒè¡šèšã¯ãããªãã¯ã¹ã®å Žåãšåãã§ãïŒã
Eigen::Vector2i Eigen::Vector3i Eigen::Vector4i Eigen::Vector2f Eigen::Vector3f Eigen::Vector4f Eigen::Vector2d Eigen::Vector3d Eigen::Vector4d
ã¯ã€ãã¯ãªãã¡ã¬ã³ã¹ãšããŠã次ã®äŸãäœæããŸããã
#include <iostream> int main() { //Fixed size 3x3 matrix of floats Eigen::Matrix3f A; A << 1, 0, 1, 2, 5, 0, 1, 1, 2; std::cout << "Matrix A:" << std::endl << A << std::endl; //Access to matrix element [1, 1]: std::cout << "A[1, 1]:" << std::endl << A(1, 1) << std::endl; //Fixed size 3 vector of floats Eigen::Vector3f B; B << 1, 0, 1; std::cout << "Vector B:" << std::endl << B << std::endl; //Access to vector element [1]: std::cout << "B[1]:" << std::endl << B(1) << std::endl; //Multiplication of vector and matrix Eigen::Vector3f C = A * B; std::cout << "C = A * B:" << std::endl << C << std::endl; //Dynamic size matrix of floats Eigen::MatrixXf D; D.resize(3, 3); //Let matrix D be an identity matrix: D.setIdentity(); std::cout << "Matrix D:" << std::endl << D << std::endl; //Multiplication of matrix and matrix Eigen::MatrixXf E = A * D; std::cout << "E = A * D:" << std::endl << E << std::endl; return 0; }
çµè«ïŒ
Matrix A: 1 0 1 2 5 0 1 1 2 A[1, 1]: 5 Vector B: 1 0 1 B[1]: 0 C = A * B: 2 2 3 Matrix D: 1 0 0 0 1 0 0 0 1 E = A * D: 1 0 1 2 5 0 1 1 2
詳现ã«ã€ããŠã¯ã
ããã¥ã¡ã³ããåç
§ããããšããå§ãã
ãŸã ã
ã¹ããŒã¹è¡å
ã¹ããŒã¹è¡åã¯ãããå°ãè€éãªã¿ã€ãã®è¡åã§ãã åºæ¬çãªèãæ¹ã¯ããããªãã¯ã¹å
šäœããã®ãŸãŸã¡ã¢ãªã«ä¿åããã®ã§ã¯ãªãããŒã以å€ã®èŠçŽ ã®ã¿ãä¿åããããšã§ãã å®éã®åé¡ã§ã¯ãå€ãã®å Žåãå°æ°ã®éãŒãèŠçŽ ãæã€å€§ããªè¡åããããŸãã FEMã¢ãã«ã§ã°ããŒãã«åæ§ãããªãã¯ã¹ãçµã¿ç«ãŠãå ŽåãéãŒãèŠçŽ ã®æ°ã¯ãèŠçŽ ã®ç·æ°ã®0.1ïŒ
æªæºã«ãªãå ŽåããããŸãã
ææ°ã®FEMããã±ãŒãžã§ã¯ãéåžžã«äžè¬çãªææ°ã®PCã§æ°åäžããŒãã®åé¡ã解決ããããšã¯åé¡ã§ã¯ãããŸããã ã°ããŒãã«åæ§ãããªãã¯ã¹ã«ã¹ãã¬ãŒãžã¹ããŒã¹ãå²ãåœãŠãããšãããšã次ã®åé¡ãçºçããŸãã

ãããªãã¯ã¹ãä¿åããããã«å¿
èŠãªã¡ã¢ãªãµã€ãºã¯èšå€§ã§ãïŒ ã¹ããŒã¹è¡åã¯ã10,000åå°ãªãã¡ã¢ãªãå¿
èŠãšããŸãã
ã¹ããŒã¹è¡åã¯ããŒã以å€ã®èŠçŽ ã®ã¿ãæ ŒçŽãããããã¡ã¢ãªãããå¹ççã«äœ¿çšããŸãã ã¹ããŒã¹è¡åã¯ãå§çž®ãšéå§çž®ã®2ã€ã®æ¹æ³ã§è¡šçŸã§ããŸãã éå§çž®åœ¢åŒã§ã¯ãè¡åã«èŠçŽ ãç°¡åã«è¿œå ãŸãã¯åé€ã§ããŸããããã®ã¿ã€ãã®è¡šçŸã¯ã¡ã¢ãªäœ¿çšéã®èгç¹ããæé©ã§ã¯ãããŸããã Eigenã¯ãã¹ããŒã¹ãããªãã¯ã¹ã§äœæ¥ããå Žåãäžçš®ã®å§çž®è¡šçŸã䜿çšããŸããããã¯ãèŠçŽ ã®åçãªè¿œå /åé€ã«å¯ŸããŠãããã«æé©åãããŠããŸãã Eigenã¯ããã®ãããªè¡åãå§çž®åœ¢åŒã«å€æããæ¹æ³ãç¥ã£ãŠããŸããããã«ãééçã«è¡ããŸããæç€ºçã«è¡ãå¿
èŠã¯ãããŸããã ã»ãšãã©ã®ã¢ã«ãŽãªãºã ã§ã¯ãå§çž®åœ¢åŒã®ãããªãã¯ã¹ãå¿
èŠã§ããããããã®ã¢ã«ãŽãªãºã ã®ããããã䜿çšãããšããããªãã¯ã¹ãèªåçã«å§çž®åœ¢åŒã«å€æãããŸãã éã«ãèŠçŽ ã远å /åé€ãããšããããªãã¯ã¹ã¯èªåçã«æé©åããã衚çŸã«å€æãããŸãã
ãããªãã¯ã¹ã¯ã©ã®ããã«å®çŸ©ã§ããŸããïŒ ãããè¡ãè¯ãæ¹æ³ã¯ããããã
ããªãã¬ããã䜿çšããããšã§ãã ããã¯ããŒã¿æ§é ã§ãããããã¯ãã³ãã¬ãŒãã¯ã©ã¹ã§ãããã³ãã¬ãŒãã¯ã©ã¹ã¯ããããªãã¯ã¹å
ã®äœçœ®ã決å®ããã€ã³ããã¯ã¹ãšçµã¿åããã1ã€ã®ãããªãã¯ã¹èŠçŽ ã§ãã
ããªãã¬ãããã¯ãã«ããã¹ããŒã¹è¡åãçŽæ¥æå®ã§ããŸãã
ããšãã°ã次ã®ã¹ããŒã¹è¡åããããŸãã
0 3 0 0 0 22 0 0 0 0 0 5 0 1 0 0 0 0 0 0 0 0 14 0 8
æåã«è¡ãå¿
èŠãããã®ã¯ãé©åãªEigenã©ã€ãã©ãªããããŒ
<Eigen / Sparse>ãå«ããããšã§ãã æ¬¡ã«ã空ã®ã¹ããŒã¹5x5è¡åã宣èšããŸãã æ¬¡ã«ã
ããªãã¬ãããã¯ãã«ãå®çŸ©ããå€ãå
¥åããŸãã
ããªãã¬ããã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãi-indexãj-indexãvalueã®åŒæ°ãåãå
¥ããŸãã
#include <Eigen/Sparse> #include <iostream> int main() { Eigen::SparseMatrix<int> A(5, 5); std::vector< Eigen::Triplet<int> > triplets; triplets.push_back(Eigen::Triplet<int>(0, 1, 3)); triplets.push_back(Eigen::Triplet<int>(1, 0, 22)); triplets.push_back(Eigen::Triplet<int>(2, 1, 5)); triplets.push_back(Eigen::Triplet<int>(2, 3, 1)); triplets.push_back(Eigen::Triplet<int>(4, 2, 14)); triplets.push_back(Eigen::Triplet<int>(4, 4, 8)); A.setFromTriplets(triplets.begin(), triplets.end()); A.insert(0, 0); std::cout << A; A.makeCompressed(); std::cout << std::endl << A; }
çµè«ã¯æ¬¡ã®ãšããã§ãã
Nonzero entries: (0,0) (22,1) (_,_) (3,0) (5,2) (_,_) (_,_) (14,4) (_,_) (_,_) (1,2) (_,_) (_,_) (8,4) (_,_) (_,_) Outer pointers: 0 3 7 10 13 $ Inner non zeros: 2 2 1 1 1 $ 0 3 0 0 0 22 0 0 0 0 0 5 0 1 0 0 0 0 0 0 0 0 14 0 8 Nonzero entries: (0,0) (22,1) (3,0) (5,2) (14,4) (1,2) (8,4) Outer pointers: 0 2 4 5 6 $ 0 3 0 0 0 22 0 0 0 0 0 5 0 1 0 0 0 0 0 0 0 0 14 0 8
ããŒã¿æ§é
å
¥åãã¡ã€ã«ããèªã¿èŸŒãããŒã¿ãšäžéããŒã¿ãä¿åããã«ã¯ãæ§é ã宣èšããå¿
èŠããããŸãã æéèŠçŽ ãèšè¿°ããæãåçŽãªããŒã¿æ§é ã以äžã«ç€ºããŸãã æéèŠçŽ ãæ§æããããŒãã®ã€ã³ããã¯ã¹ãšè¡åBãæ ŒçŽãã3ã€ã®èŠçŽ ã®é
åã§æ§æãããŸãããã®è¡åã¯åŸé
è¡åãšåŒã°ããåŸã§æ»ããŸãã CalculateStiffnessMatrixã¡ãœããã«ã€ããŠãåŸè¿°ããŸãã
struct Element { void CalculateStiffnessMatrix(const Eigen::Matrix3f& D, std::vector<Eigen::Triplet<float> >& triplets); Eigen::Matrix<float, 3, 6> B; int nodesIds[3]; };
å¿
èŠãªãã1ã€ã®åçŽãªæ§é ã¯ããã€ã³ãã£ã³ã°ãèšè¿°ããããã®æ§é ã§ãã ããã¯ãå¶éã®ã¿ã€ããå®çŸ©ããåæåãšãå¶éã課ãããããŒãã®ã€ã³ããã¯ã¹ã§æ§æãããåçŽãªæ§é ã§ãã
struct Constraint { enum Type { UX = 1 << 0, UY = 1 << 1, UXY = UX | UY }; int node; Type type; };
ç©äºãåçŽã«ããããã«ãããã€ãã®ã°ããŒãã«å€æ°ãå®çŸ©ããŸãããã ã°ããŒãã«ãªããžã§ã¯ããäœæããããšã¯åžžã«æªãèãã§ããããã®äŸã§ã¯å®å
šã«åãå
¥ããããŸãã æ¬¡ã®ã°ããŒãã«å€æ°ãå¿
èŠã§ãã
- ããŒãæ°
- X座æšããŒããæã€ãã¯ãã«
- ããŒãã®y座æšãæã€ãã¯ãã«
- èŠçŽ ãã¯ãã«
- ãã³ãã¯ãã«
- è·éãã¯ãã«
ã³ãŒãã§ã¯ã次ã®ããã«å®çŸ©ããŸãã
int nodesCount; int noadsCount; Eigen::VectorXf nodesX; Eigen::VectorXf nodesY; Eigen::VectorXf loads; std::vector< Element > elements; std::vector< Constraint > constraints;
å
¥åãã¡ã€ã«ã®èªã¿åã
äœããèªãåã«ãã©ãã§åºåãèªã¿ãã©ãã«æžã蟌ãããç¥ãå¿
èŠããããŸãã
ã¡ã€ã³é¢æ°ã®æåã§ãå
¥ååŒæ°ã®æ°ã確èªããŸããæåã®åŒæ°ã¯åžžã«å®è¡å¯èœãã¡ã€ã«ãžã®ãã¹ã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠã3ã€ã®åŒæ°ãå¿
èŠã§ãã2ã€ç®ã¯å
¥åãã¡ã€ã«ãžã®ãã¹ã3ã€ç®ã¯åºåãã¡ã€ã«ãžã®ãã¹ãšããŸãã å
¥å/åºåã䜿çšããå Žåãç¹å®ã®ã±ãŒã¹ã§ã¯ãæšæºã©ã€ãã©ãªã®ãã¡ã€ã«ã¹ããªãŒã ã䜿çšããã®ãæã䟿å©ã§ãã
æåã«è¡ãããšã¯ãå
¥å/åºåçšã®ã¹ã¬ãããäœæããããšã§ãã
int main(int argc, char *argv[]) { if ( argc != 3 ) { std::cout << "usage: " << argv[0] << " <input file> <output file>\n"; return 1; } std::ifstream infile(argv[1]); std::ofstream outfile(argv[2]);
å
¥åãã¡ã€ã«ã®æåã®è¡ã«ã¯ææç¹æ§ãå«ãŸããŠãããããããèªã¿åããŸãã
float poissonRatio, youngModulus; infile >> poissonRatio >> youngModulus;
ããã¯ãå¹³é¢å¿åç¶æ
ã®çæ¹æ§ææã®åŒŸæ§ãããªãã¯ã¹ãæ§ç¯ããã®ã«ååã§ãããæ¬¡ã®ããã«å®çŸ©ãããŸãã


ãããã®è¡šçŸã¯ã©ãããæ¥ãã®ã§ããïŒ ãããã¯äžè¬çãªåœ¢ã§ããã¯ã®æ³åããç°¡åã«ååŸã§ããŸã;å®éãæ¬¡ã®é¢ä¿ããè¡åDã®åŒãèŠã€ããããšãã§ããŸãïŒ

å¹³é¢å¿åç¶æ
ã¯ãÏZããŒãã§ããããšãæå³ããŸããã
εZã§ã¯ãªãããšã«æ³šæããŠãã ããã å¹³é¢å¿åã¢ãã«ã¯ã平颿§é ãèæ
®ããããã¹ãŠã®åãå¹³é¢ã§äœçšããå€ãã®å·¥åŠçåé¡ã解決ããã®ã«é©ããŠããŸãã äœç©ã®åé¡ã®èšç®ãé«ããããšããå€ãã®ã¿ã¹ã¯ããã©ããã«ãªãã粟床ãç ç²ã«ãªããŸããã
å¹³é¢å¿åç¶æ
ã§ã¯ã身äœããã®å¹³é¢ã«åçŽãªæ¹åã«å€åœ¢ããã®ã劚ãããã®ã¯ãªããããæªã¿ÎµZã¯äžè¬ã«ãŒãã«çãããããŸããã äžèšã®åŒã«ã¯çŸããŸããããé»å§ÏZããŒãã®å Žåãæ¬¡ã®é¢ä¿ããç°¡åã«ååŸã§ããŸãã

匟æ§è¡åãèšå®ããããã®ãã¹ãŠã®ãœãŒã¹ããŒã¿ããããŸãããããè¡ããŸãããã
Eigen::Matrix3f D; D << 1.0f, poissonRatio, 0.0f, poissonRatio, 1.0, 0.0f, 0.0f, 0.0f, (1.0f - poissonRatio) / 2.0f; D *= youngModulus / (1.0f - pow(poissonRatio, 2.0f));
次ã«ãããŒãã®åº§æšãå«ããªã¹ããèªã¿åããŸãã æåã«ããŒãã®æ°ãèªã¿åããæ¬¡ã«åçãã¯ãã«xããã³yã®ãµã€ãºãèšå®ããŸãã æ¬¡ã«ãã«ãŒãå
ã®ããŒãã®åº§æšã1è¡ãã€èªã¿åããŸãã
infile >> nodesCount; nodesX.resize(nodesCount); nodesY.resize(nodesCount); for (int i = 0; i < nodesCount; ++i) { infile >> nodesX[i] >> nodesY[i]; }
次ã«ãã¢ã€ãã ã®ãªã¹ããèªã¿åããŸãã ãã¹ãŠåãã§ããèŠçŽ ã®æ°ãèªã¿åããæ¬¡ã«åèŠçŽ ã®ããŒãã€ã³ããã¯ã¹ãèªã¿åããŸãã
int elementCount; infile >> elementCount; for (int i = 0; i < elementCount; ++i) { Element element; infile >> element.nodesIds[0] >> element.nodesIds[1] >> element.nodesIds[2]; elements.push_back(element); }
次ã«ããã³ã®ãªã¹ããèªã¿ãŸãã ãã¹ãŠåãïŒ
int constraintCount; infile >> constraintCount; for (int i = 0; i < constraintCount; ++i) { Constraint constraint; int type; infile >> constraint.node >> type; constraint.type = static_cast<Constraint::Type>(type); constraints.push_back(constraint); }
static_castã«æ°ä»ããããããŸãããã宣èšãã
ãã€ã³ãã£ã³ã°ã®ããã«
intåã以åã«åæãããåã«å€æããå¿
èŠããã
ãŸã ã
æåŸã«ãããŒãã®ãªã¹ããèªãå¿
èŠããããŸãã è·éã«é¢é£ããç¹åŸŽã1ã€ãããŸãããã®ãããäœçšè·éã2åã®æ°ã®ããŒãã®æ¬¡å
ãã¯ãã«ã®åœ¢åŒã§ç€ºããŸãã ãããè¡ãçç±ã«ã€ããŠã¯ãåŸã»ã©èª¬æããŸãã æ¬¡ã®å³ã¯ããã®è² è·ãã¯ãã«ã瀺ããŠããŸãã

ãããã£ãŠãåããŒãã«ã€ããŠãè·éã®xããã³yæåã衚ãè·éãã¯ãã«ã«2ã€ã®èŠçŽ ããããŸãã ãããã£ãŠãç¹å®ã®ããŒãã®åã®xã³ã³ããŒãã³ãã¯ã€ã³ããã¯ã¹id = 2 * node_id + 0ã®èŠçŽ ã«æ ŒçŽããããã®ããŒãã®åã®yã³ã³ããŒãã³ãã¯ã€ã³ããã¯ã¹id = 2 * node_id + 1ã®èŠçŽ ã«æ ŒçŽãããŸãã
ãŸããé©çšãããåªåã®ãã¯ãã«ã®ãµã€ãºãããŒãã®æ°ã®2åã«èšå®ããæ¬¡ã«ãã¯ãã«ããŒãã«ããŸãã å€åã®æ°ãèªã¿åãããã®å€ãè¡ããšã«èªã¿åããŸãã
int loadsCount; loads.resize(2 * nodesCount); loads.setZero(); infile >> loadsCount; for (int i = 0; i < loadsCount; ++i) { int node; float x, y; infile >> node >> x >> y; loads[2 * node + 0] = x; loads[2 * node + 1] = y; }
ã°ããŒãã«åæ§ãããªãã¯ã¹ã®èšç®
埮å°å€äœã䌎ã幟äœåŠçç·ââ圢ã·ã¹ãã ãèããŸãã ããã«ãå€åœ¢ã¯åŒŸæ§çã«çºçãããšä»®å®ããŸãã å€åœ¢ã¯å¿åã®ç·åœ¢é¢æ°ã§ãïŒããã¯ã®æ³åïŒã å»ºç¯æ§é ã®åºç€ãããåããŒãã®åãã¯ãå ããããåã®ç·åœ¢é¢æ°ã§ããããšã瀺ãããŸãã ãããã£ãŠã次ã®ç·åœ¢æ¹çšåŒç³»ããããšèšããŸãã

ããã§ïŒK-åæ§ãããªãã¯ã¹; ÎŽã¯å€äœãã¯ãã«ã§ãã Rã¯è·éã®ãã¯ãã«ãã€ãŸãå€åã®ãã¯ãã«ã§ãã ãã®ç·åœ¢æ¹çšåŒç³»ã¯ã以äžã«ç€ºãããã«ãåèŠçŽ ã®åæ§ãããªãã¯ã¹ã®éãåããã衚ããããã¢ã³ãµã³ãã«ãšåŒã°ããããšããããããŸãã
2次å
åé¡ã®å€äœãã¯ãã«ã¯ã次ã®ããã«å®çŸ©ã§ããŸãã


ããã§ãu
iããã³v
iã¯ãiçªç®ã®ããŒãã®ç§»åã®uã³ã³ããŒãã³ãããã³vã³ã³ããŒãã³ãã§ãã
å€åã®ãã¯ãã«ïŒ


ããã§ãR
xiãšR
yi -içªç®ã®ããŒãã«é©çšãããå€åã®xæåãšyæåã
ã芧ã®ãšãããå€äœãã¯ãã«ãšè² è·ãã¯ãã«ã®åèŠçŽ ã¯2次å
ãã¯ãã«ã§ãã 代ããã«ããããã®ãã¯ãã«ã次ã®ããã«å®çŸ©ã§ããŸãã

ããã¯å®éã«ã¯åãããšã§ãããã³ãŒãå
ã®ãããã®ãã¯ãã«ã®è¡šçŸãåçŽåããŸãã ããã¯ã以åã«ãã®ãããªç¹ç°ãªæ¹æ³ã§è² è·ãã¯ãã«ãèšå®ããçç±ã®èª¬æã§ãã
åæ§ãããªãã¯ã¹ã®äœææ¹æ³ã¯ïŒ ã°ããŒãã«åæ§ãããªãã¯ã¹ã®æ¬è³ªã¯ãåèŠçŽ ã®åæ§ãããªãã¯ã¹ã®éãåããã§ãã 1ã€ã®èŠçŽ ãä»ã®èŠçŽ ãšã¯å¥ã«æ€èšãããšãåãåæ§ãããªãã¯ã¹ã決å®ã§ããŸããããã®èŠçŽ ã«ã€ããŠã®ã¿ã§ãã ãã®ãããªãã¯ã¹ã¯ãããŒãã®åããšç¯ç¹åã®é¢ä¿ã決å®ããŸãã ããšãã°ã3ããŒãèŠçŽ ã®å ŽåïŒ


ããã§ã[k]
eã¯eèŠçŽ ã®åæ§ãããªãã¯ã¹ã§ãã [ÎŽ]
eã¯ãeèŠçŽ ã®ç¯ç¹ã®å€äœã®ãã¯ãã«ã§ãã [F]
eã¯ãeèŠçŽ ã®ç¯ç¹åã®ãã¯ãã«ã§ãã iãjãmã¯ãèŠçŽ ã®ããŒãã®ã€ã³ããã¯ã¹ã§ãã
1ã€ã®ããŒãã2ã€ã®èŠçŽ ã«åå²ããããšã©ããªããŸããïŒ ãŸã第äžã«ãããã¯ãŸã åãããŒãã§ãããããç§»åã¯ãã®ããŒããæ€èšããŠããèŠçŽ ã®æ§æã«äŸåããŸããã 2çªç®ã®éèŠãªçµæã¯ããã®ããŒãã®åèŠçŽ ããã®ãã¹ãŠã®ç¯ç¹åãèŠçŽãããšãçµæã¯å€åãã€ãŸãè·éã«çãããªããŸãã
åããŒãã®ãã¹ãŠã®ç¯ç¹åã®åèšã¯ããã®ããŒãã®å€åã®åèšã«çãããªããŸããããã¯ã平衡ã®åçã«åºã¥ããŠããŸãã ãã®å£°æã¯éåžžã«è«ççã§å
¬å¹³ã«èŠãããããããªããšããäºå®ã«ãããããããå®éã«ã¯ããã¹ãŠãå°ãè€éã§ãã ãã®ãããªå®åŒåã¯æ£ç¢ºã§ã¯ãããŸããããªããªããç¯ç¹ã®åã¯èšèã®äžè¬çãªæå³ã§ã®åã§ã¯ãªãããããã®å¹³è¡¡æ¡ä»¶ã®å®çŸã¯ãŸã£ããæãããªæ¡ä»¶ã§ã¯ãªãããã§ãã 声æã¯ãŸã çå®ã§ãããšããäºå®ã«ãããããããããã¯æ¹æ³ã®é©çšãå¶éããæ©æ¢°çåçã䜿çšããŠããŸãã ããã³ã·ã£ã«ãšãã«ã®ãŒãæå°åãããšãã芳ç¹ãããFEMã«ã¯ããå³å¯ãªæ°åŠçæ£åœåãããããã®æ¹æ³ãããåºç¯ãªåé¡ã«æ¡åŒµããããšãå¯èœã«ãªããŸãã
ç§ã®æèŠã§ã¯ãã©ã°ã©ã³ãžã¥ååŠã®è¡šçŸã«ãããŠãç¯ç¹åãããçš®ã®äžè¬åãããåãšèããæ¹ãè¯ãã§ãã å®éãããŒãã®ç§»åã¯ãèŠçŽ å
ã®å€äœã®ãã£ãŒã«ããäžæã«ç¹åŸŽä»ãããããå®éã«ã¯äžè¬åãããç§»åã§ãã
ããŒãã®åãã®åã³ã³ããŒãã³ãã¯ãäžè¬åããã座æšãšããŠè§£éã§ããŸãããããã£ãŠãåã¯ããŒãã®ç¹ã§ã¯ãªããèŠçŽ ã®å¢çã«æ²¿ã£ãŠïŒãŸãã¯ããªã¥ãŒã åã®ããªã¥ãŒã ã§ïŒäœçšããäžããããããŒããç¹åŸŽä»ããåãã«æ£ç¢ºã«äœçšããŸããåããŒãã®ãã¹ãŠã®æ¹çšåŒãåèšãããšãèŠçŽ éã®ç¯ç¹åã¯ãªããªããŸããæ¹çšåŒã®å³åŽã«ã¯ãå€å-è² è·ã®ã¿ãæ®ããŸãããããã£ãŠããã®äºå®ãèãããšã次ã®ããã«èšè¿°ã§ããŸãã
次ã®å³ã¯ãäžèšã®åŒã瀺ããŠããŸãã
ã°ããŒãã«åæ§ãããªãã¯ã¹ãäœæããã«ã¯ãããªãã¬ãããã¯ãã«ãå¿
èŠã§ããã«ãŒãã§ã¯ãåèŠçŽ ã調ã¹ããã®ãã¯ãã«ã«åèŠçŽ ããååŸããåæ§ãããªãã¯ã¹ã®å€ãå
¥åããŸãã std::vector<Eigen::Triplet<float> > triplets; for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) { it->CalculateStiffnessMatrix(D, triplets); }
ããã§ãstd :: vector <Eigen :: Triplet <float >> -vector triplets ; CalculateStiffnessMatrixã¯ãããªãã¬ãããã¯ãã«ãåããèŠçŽ ã¯ã©ã¹ã¡ãœããã§ããåè¿°ããããã«ãããªãã¬ãããã¯ãã«ããçŽæ¥ã°ããŒãã«ã¹ããŒã¹è¡åãæ§ç¯ã§ããŸãã Eigen::SparseMatrix<float> globalK(2 * nodesCount, 2 * nodesCount); globalK.setFromTriplets(triplets.begin(), triplets.end());
åã
ã®èŠçŽ ã®åæ§ãããªãã¯ã¹ã®èšç®
èŠçŽ ã®ãããªãã¯ã¹ããã°ããŒãã«åæ§ãããªãã¯ã¹ïŒã¢ã³ãµã³ãã«ïŒãçµã¿ç«ãŠãæ¹æ³ãèŠã€ããŸããããèŠçŽ ã®åæ§ãããªãã¯ã¹ãååŸããæ¹æ³ãèŠã€ããããšã¯æ®ã£ãŠããŸãããã©ãŒã 颿°
ããŒãã®åãã«åºã¥ããŠèŠçŽ å
ã®åããè£éããããšããå§ããŸããããããŒãã®å€äœãæå®ãããŠããå ŽåãèŠçŽ ã®ä»»æã®ç¹ã§ã®å€äœã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã
ããã§ã[N]ã¯åº§æšé¢æ°ïŒxãyïŒã®è¡åã§ãããããã®é¢æ°ã¯ãã©ãŒã 颿°ãšåŒã°ããŸããåå€äœæåuããã³vã¯ãç¬ç«ããŠè£éããããšãã§ããäžèšã®æ¹çšåŒã¯æ¬¡ã®åœ¢åŒã§æžãæãã
ããšãã§ããŸãããŸãã¯ãå¥ã®åœ¢åŒã§èšè¿°ããããšãã§ããŸãïŒå

æ¿é¢æ°ãååŸããã«ã¯ïŒç°¡åã«ããããã«ãã¹ã«ã©ãŒãã£ãŒã«ããèŠãŠã¿ãŸãããã 3ããŒãç·åœ¢èŠçŽ ã®å Žåãè£é颿°ã¯ç·åœ¢ã§ããæ¬¡ã®åœ¢åŒã§è£éåŒãæ¢ã
ãŸããå€ãããŒãã®fãããã£ãŠããå Žåã3ã€ã®æ¹çšåŒã®ã·ã¹ãã ãæå®ã§ããŸãïŒ
ãŸãã¯è¡å圢åŒïŒ
ãã®æ¹çšåŒã®ã·ã¹ãã ãããè£éåŒã®æªç¥ã®ä¿æ°ãã¯ãã«ãèŠã€ããããšãã§ããŸãïŒ
è¡šèšæ³ãå°å
¥ããŸã
æåŸã«ãè£éåŒãååŸããŸãïŒ
å€äœã«æ»ãããšèšãããšãã§ããŸãwhatïŒ
次ã«ããã©ãŒã 颿°ã¯æ¬¡ã®ããã«ãªããŸãã
å€åœ¢ãšåŸé
è¡å
å€äœå Žãç¥ããšã匟æ§ã®çè«ããã®é¢ä¿ã«åŸã£ãŠãå€åœ¢å ŽãèŠã€ããããšãã§ããŸãïŒ
ããã§ãuãšvãæ¬¡ã®åœ¢åŒã®é¢æ°ã«çœ®ãæãã

ããšãã§ããŸãïŒãŸãã¯ãåã圢åŒãçµã¿åããã圢åŒã§æžãããšãã§ããŸãïŒ
éåžžãè¡åBãšããŠç€ºãããå³åŽã®è¡åãããããåŸé
è¡åã
è¡åBãèŠã€ããã«ã¯ããã©ãŒã 颿°ã®ãã¹ãŠã®åå°é¢æ°ãèŠã€ããå¿
èŠããããŸãïŒ
ç·åœ¢èŠçŽ ã®å Žåããã©ãŒã 颿°ã®åå°é¢æ°ã¯å®éã«ã¯å®æ°ã§ããã以äžã«ç€ºãããã«ãå€ãã®åŽåãç¯çŽã§ããŸããè¡ãã¯ãã«ã«å®æ°ãä¹ç®ãããšãéè¡åCãåŸãããŸãã
ããã§ãBè¡åãèšç®ã§ããŸããè¡åCãäœæããã«ã¯ããŸãããŒãã®åº§æšãã¯ãã«ãå®çŸ©ããŸãã Eigen::Vector3f x, y; x << nodesX[nodesIds[0]], nodesX[nodesIds[1]], nodesX[nodesIds[2]]; y << nodesY[nodesIds[0]], nodesY[nodesIds[1]], nodesY[nodesIds[2]];
次ã«ã3è¡ããè¡åCãäœæã§ããŸãã Eigen::Matrix3f C; C << Eigen::Vector3f(1.0f, 1.0f, 1.0f), x, y;
次ã«ãéè¡åCãèšç®ããè¡åBãåéããŸãã Eigen::Matrix3f IC = C.inverse(); for (int i = 0; i < 3; i++) { B(0, 2 * i + 0) = IC(1, i); B(0, 2 * i + 1) = 0.0f; B(1, 2 * i + 0) = 0.0f; B(1, 2 * i + 1) = IC(2, i); B(2, 2 * i + 0) = IC(2, i); B(2, 2 * i + 1) = IC(1, i); }
ã¹ãã¬ã¹ãžã®ç§»è¡
åè¿°ã®ããã«ãå¿åãšã²ãã¿ã®é¢ä¿ã¯åŒŸæ§è¡åDã䜿çšããŠèšè¿°ã§ããŸãã
ãããã£ãŠãäžèšã®åŒãã²ãã¿ã®é¢ä¿ã«ä»£å
¥ãããšã次ã®ããã«ãªã
ãŸããããã§ãå¿åã¯ã²ãã¿ãšåæ§ã«èŠçŽ å
ã®å®æ°ã§ããããšãããããŸããããã¯ç·åœ¢èŠçŽ ã®ç¹åŸŽã§ãããã ãã髿¬¡ã®èŠçŽ ã®å Žåãå¿åã®é£ç¶æ§ãæºããããŸãããèŠçŽ ã®æ°ãå¢ãããšããããã®ã®ã£ãããæžå°ããã¯ãã§ãããããåæã®åºæºã§ããå®éã«ã¯ãåããŒãã®å¹³åã²ãã¿å€ãéåžžèšç®ãããŸããããã®äŸã§ã¯ããã¹ãŠããã®ãŸãŸã«ããŸããããŒãã£ã«ã¯ãŒã¯ã®åç
åæ§ãããªãã¯ã¹ã«ç§»åããã«ã¯ãä»®æ³äœæ¥ã«åãæ¿ããå¿
èŠããããŸããèŠçŽ ã®ããŒãã«ããã€ãã®ä»®æ³å€äœããããšããŸãããïŒd [ÎŽ] eä»®æ³å€äœã¯ãçºçããå¯èœæ§ã®ããç¡éã«å°ããªå€äœãšããŠçè§£ãããã¹ãã§ããç§ãã¡ã®ã¿ã¹ã¯ã®å Žåã解決çã¯1ã€ã ãã§ãåãã®ã»ããã¯1ã€ããçºçããªãããšãããã£ãŠããŸãããããã§ã¯ãã¹ãŠããããã«ç°ãªãè§åºŠããèŠãŸããèšãæãããšãéååŠçã«èš±å®¹ããããã¹ãŠã®åŸ®å°å€äœãååŸããç©çæ³åãæºããå¯äžã®å€äœãèŠã€ããŸãããããã®ä»®æ³éåã®å Žåãç¯ç¹åã®ä»®æ³äœæ¥ã¯æ¬¡ã®ããã«ãªããŸãã
åãä»®æ³éåã®åäœäœç©ãããã®å
éšå¿åã®ä»®æ³äœæ¥ïŒ
ãŸãã¯ïŒ

, :

, :

, , :

, . , , , :

, , . , :
ããã§ãAã¯èŠçŽ ã®é¢ç©ãtã¯èŠçŽ ã®åãã§ããäžè§åœ¢ã®ããããã£ããããã®é¢ç©ã¯è¡åCã®è¡ååŒã®ååãšããŠååŸã§ããŸãã
æåŸã«ãåæ§è¡åãèšç®ããæ¬¡ã®ã³ãŒããèšè¿°ã§ããŸãã Eigen::Matrix<float, 6, 6> K = B.transpose() * D * B * C.determinant() / 2.0f;
ããã§åããæžãããŸããããç§ãã¡ã¯ãããç§ãã¡ãšäžç·ã§ãããšä»®å®ããŸããéåžžãå®éã«ã¯ã次ã®åäœã·ã¹ãã ã䜿çšããŸãïŒMPaãmm 2ããã®å Žåã匟æ§çãã¡ã¬ãã¹ã«ã«ã§ã寞æ³ãããªã¡ãŒãã«ã§èšå®ãããšãåãã¯1ããªã¡ãŒãã«ã«ãªããŸããç°ãªãåããå¿
èŠãªå Žåã匟æ§ä¿æ°ã«ç°¡åã«å°å
¥ã§ããŸããããäžè¬çãªã±ãŒã¹ã§ã¯ãåããèŠçŽ ããšã«èšå®ããããåããŒãã«èšå®ããããšããå§ãããŸããCalculateStiffnessMatrixã¡ãœããå
šäœïŒ void Element::CalculateStiffnessMatrix(const Eigen::Matrix3f& D, std::vector<Eigen::Triplet<float> >& triplets) { Eigen::Vector3f x, y; x << nodesX[nodesIds[0]], nodesX[nodesIds[1]], nodesX[nodesIds[2]]; y << nodesY[nodesIds[0]], nodesY[nodesIds[1]], nodesY[nodesIds[2]]; Eigen::Matrix3f C; C << Eigen::Vector3f(1.0f, 1.0f, 1.0f), x, y; Eigen::Matrix3f IC = C.inverse(); for (int i = 0; i < 3; i++) { B(0, 2 * i + 0) = IC(1, i); B(0, 2 * i + 1) = 0.0f; B(1, 2 * i + 0) = 0.0f; B(1, 2 * i + 1) = IC(2, i); B(2, 2 * i + 0) = IC(2, i); B(2, 2 * i + 1) = IC(1, i); } Eigen::Matrix<float, 6, 6> K = B.transpose() * D * B * C.determinant() / 2.0f; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Eigen::Triplet<float> trplt11(2 * nodesIds[i] + 0, 2 * nodesIds[j] + 0, K(2 * i + 0, 2 * j + 0)); Eigen::Triplet<float> trplt12(2 * nodesIds[i] + 0, 2 * nodesIds[j] + 1, K(2 * i + 0, 2 * j + 1)); Eigen::Triplet<float> trplt21(2 * nodesIds[i] + 1, 2 * nodesIds[j] + 0, K(2 * i + 1, 2 * j + 0)); Eigen::Triplet<float> trplt22(2 * nodesIds[i] + 1, 2 * nodesIds[j] + 1, K(2 * i + 1, 2 * j + 1)); triplets.push_back(trplt11); triplets.push_back(trplt12); triplets.push_back(trplt21); triplets.push_back(trplt22); } } }
ã¡ãœããã®æåŸã«ãåæ§ãããªãã¯ã¹ãèšç®ããåŸãããªãã¬ãããã¯ãã«ãå¡ãã€ã¶ãããŸããåããªãã¬ããã¯ãèŠçŽ ããŒãã€ã³ããã¯ã¹ã®é
åã䜿çšããŠäœæãããã°ããŒãã«åæ§ãããªãã¯ã¹å
ã®äœçœ®ã決å®ããŸãã念ã®ããã2ã€ã®ã€ã³ããã¯ã¹ã®ã»ãããããããšã匷調ããŸãã1ã€ã¯èŠçŽ è¡åã«å¯ŸããŠããŒã«ã«ã§ããã1ã€ã¯ã¢ã³ãµã³ãã«ã«å¯ŸããŠã°ããŒãã«ã§ãããžã§ãã«åå ãã
çµæã®ç·åœ¢æ¹çšåŒç³»ã¯ãä¿®æ£ãããŸã§è§£ããŸãããçŽç²ã«æ©æ¢°çãªèгç¹ããèŠããšãåºå®ãããŠããªãã·ã¹ãã ã¯å€§ããªå€äœãè¡ãããšãã§ããå€åã®åœ±é¿äžã§å®å
šã«åãå§ããŸããæ°åŠçã«ã¯ãããã«ãããååŸããSLAEãç·åœ¢ç¬ç«ã§ã¯ãªããããç¬èªã®è§£æ±ºçããªããšããäºå®ã«ã€ãªãããŸããäžéšã®ããŒãã®åãã¯ããŒããŸãã¯æå®ã®å€ã«èšå®ããå¿
èŠããããŸããæãåçŽãªã±ãŒã¹ã§ã¯ãåæãªãã»ãããªãã§ãããŒãã®ä¿®æ£ã®ã¿ãæ€èšããŸããããå®éãããã¯ã·ã¹ãã ããããã€ãã®æ¹çšåŒãåé€ããŠããããšãæå³ããŸããããããã·ã¹ãã æ¹çšåŒã®éããã®å Žã§å€æŽããããšã¯ç°¡åãªäœæ¥ã§ã¯ãããŸããã代ããã«ã次ã®ããªãã¯ã䜿çšã§ããŸããæ¬¡ã®æ¹çšåŒç³»ã
ãããšããŸããããŒããä¿®æ£ããã«ã¯ã察å¿ããè¡åèŠçŽ ã1ã«èšå®ãããã®èŠçŽ ãå«ãè¡ãšåã®ãã¹ãŠã®èŠçŽ ããŒãã«èšå®ããå¿
èŠããããŸãããŸããå¶éãäœçšããæ¹åã«åºå®ãŠãããã«äœçšããå€åããã£ãŠã¯ãªããŸããããã®ããŒããå«ãæ¹çšåŒã¯ããã®ããŒãã®ãŒããªãã»ãããæç€ºçã«äžãã察å¿ããåã®ãŒãã¯ãã®ãªãã»ãããä»ã®æ¹çšåŒããé€å€ããŸãã x軞æ¹åã«ãŒãããŒããä¿®æ£ããy軞æ¹åã«æåã®ããŒããä¿®æ£ãããšããŸãã
ãã®æäœãå®è¡ããã«ã¯ããŸãSLAEããé€å€ããæ¹çšåŒã®ã€ã³ããã¯ã¹ã決å®ããŸãããããè¡ãã«ã¯ããµã€ã¯ã«å
ã®ãã³ã®ãªã¹ãã調ã¹ãŠãã€ã³ããã¯ã¹ãã¯ãã«ãåéããŸããæ¬¡ã«ãåæ§ãããªãã¯ã¹ã®ãã¹ãŠã®éãŒãèŠçŽ ããœãŒãããŠãSetConstraints颿°ãåŒã³åºããŸãã以äžã¯ãApplyConstraints颿°ã§ãã void ApplyConstraints(Eigen::SparseMatrix<float>& K, const std::vector<Constraint>& constraints) { std::vector<int> indicesToConstraint; for (std::vector<Constraint>::const_iterator it = constraints.begin(); it != constraints.end(); ++it) { if (it->type & Constraint::UX) { indicesToConstraint.push_back(2 * it->node + 0); } if (it->type & Constraint::UY) { indicesToConstraint.push_back(2 * it->node + 1); } } for (int k = 0; k < K.outerSize(); ++k) { for (Eigen::SparseMatrix<float>::InnerIterator it(K, k); it; ++it) { for (std::vector<int>::iterator idit = indicesToConstraint.begin(); idit != indicesToConstraint.end(); ++idit) { SetConstraints(it, *idit); } } } }
SetConstraints颿°ã¯ãåæ§ãããªãã¯ã¹èŠçŽ ãé€å€ãããæ¹çšåŒã®äžéšã§ãããã©ããã確èªãããã®å ŽåãèŠçŽ ã察è§ç·äžã«ãããã©ããã«å¿ããŠããŒããŸãã¯1ã«èšå®ããŸãã void SetConstraints(Eigen::SparseMatrix<float>::InnerIterator& it, int index) { if (it.row() == index || it.col() == index) { it.valueRef() = it.row() == it.col() ? 1.0f : 0.0f; } }
次ã«ãåã«ApplyConstraintsãåŒã³åºããŠãã°ããŒãã«åæ§ãããªãã¯ã¹ãšè£åŒ·ãã¯ãã«ãåŒæ°ãšããŠæž¡ããŸãã ApplyConstraints(globalK, constraints)
SLAUãœãªã¥ãŒã·ã§ã³ãšåºå
Eigenã©ã€ãã©ãªã«ã¯ãããŸããŸãªã¹ããŒã¹ç·åœ¢æ¹çšåŒãœã«ããŒãçšæãããŠããŸããé«éã®çŽæ¥ãœã«ããŒã§ããSimplicialLDLTã䜿çšããŸãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ãå
ã®åæ§ãããªãã¯ã¹ãšè·éãã¯ãã«ãå°åºããè§£ã®çµæã§ããå€äœãã¯ãã«ãåºåããŸãã std::cout << "Global stiffness matrix:\n"; std::cout << static_cast<const Eigen::SparseMatrixBase<Eigen::SparseMatrix<float> >& > (globalK) << std::endl; std::cout << "Loads vector:" << std::endl << loads << std::endl << std::endl; Eigen::SimplicialLDLT<Eigen::SparseMatrix<float> > solver(globalK); Eigen::VectorXf displacements = solver.solve(loads); std::cout << "Displacements vector:" << std::endl << displacements << std::endl; outfile << displacements << std::endl;
ãã¡ããããããªãã¯ã¹æšè«ã¯ã2ã€ã®èŠçŽ ã®ã¿ãå«ããã¹ãã±ãŒã¹ã§ã®ã¿æå³ããããŸããçµæã®åæ
åã«èŠãããã«ãå€äœããã²ãã¿ããããŠå¿åãžãšç§»åã§ããŸãïŒ
ãã ããäžè¬çã«èšãã°åŒŸæ§çè«ã§ã¯ç¬¬2ã©ã³ã¯ã®å¯Ÿç§°ãã³ãœã«ã§ããå¿åãã¯ãã«ãååŸã
ãŸãïŒãåç¥ã®ããã«ããã³ãœã«èŠçŽ ã¯åº§æšç³»ã«çŽæ¥äŸåããŸããããã¡ãããç©ççãªç¶æ
èªäœã¯ç¬ç«ããŠããŸãããããã£ãŠãåæã®ããã«ãããçš®ã®äžå€éãšããŠæ€èšããæ¹ãé©åã§ãããã¹ã«ã©ãŒã«ããã®ãæåã§ããããŒãŒã¹å¿åã¯ãã®ãããªäžå€éã§ãã
ãã®ã¹ã«ã©ãŒéã«ãããäžè»žå¿åç¶æ
ãæ±ã£ãŠãããã®ããã«ãè€éãªå¿åç¶æ
ã®å¿åãæšå®ã§ããŸãããã®åºæºã¯çæ³çã§ã¯ãããŸããããã»ãšãã©ã®å Žåãéçåæã§ã¯å€ããå°ãªãã劥åœãªç»åãæäŸãããããå®éã«æããã䜿çšãããŸããæ¬¡ã«ããµã€ã¯ã«å
ã®ãã¹ãŠã®èŠçŽ ã調ã¹ãŠãåèŠçŽ ã®ããŒãŒã¹å¿åãèšç®ããŸãã std::cout << "Stresses:" << std::endl; for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) { Eigen::Matrix<float, 6, 1> delta; delta << displacements.segment<2>(2 * it->nodesIds[0]), displacements.segment<2>(2 * it->nodesIds[1]), displacements.segment<2>(2 * it->nodesIds[2]); Eigen::Vector3f sigma = D * it->B * delta; float sigma_mises = sqrt(sigma[0] * sigma[0] - sigma[0] * sigma[1] + sigma[1] * sigma[1] + 3.0f * sigma[2] * sigma[2]); std::cout << sigma_mises << std::endl; outfile << sigma_mises << std::endl; }
ããã«ã€ããŠã¯ãæãåçŽãªFEMèšç®æ©ã®èšè¿°ã¯å®äºããŠãããšèããããšãã§ããŸãããã¹ãåé¡ã«å¯ŸããŠã©ã®ãããªçµè«ãåŸããããèŠãŠã¿ãŸãããã Global stiffness matrix: 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1483.52 0 0 714.286 -384.615 -384.615 0 0 0 1 0 0 0 0 0 0 0 0 1483.52 0 -1098.9 -329.67 0 0 714.286 0 0 1483.52 -384.615 -384.615 0 0 -384.615 0 -1098.9 -384.615 1483.52 714.286 0 0 -384.615 0 -329.67 -384.615 714.286 1483.52 Loads vector: 0 0 0 0 0 1 0 1 Deformations vector: 0 0 -0.0003 0 -5.27106e-011 0.001 -0.0003 0.001 Stresses: 2 2
åºå®ãæ£ããèšå®ãããšã察å¿ããæ¹åã®åºå®ããŒãã®å€åœ¢ã¯ãŒãã«ãªããŸããäžéšããŒãã®å€åœ¢ã¯ã匵åã«å¿ããŠäžæ¹ã«åããããŸããããŒãã®å³åŽã®ãã¢ã®xæ¹åã®å€åœ¢ã¯0.0003ã§ãããã¯yæ¹åã®äžéšããŒãã®å€åœ¢ã®0.3éšåã§ãããããã¯ãã¢ãœã³å¹æã§ããèšç®çµæã¯æåŸ
ãšå®å
šã«äžèŽããŠãããããããè峿·±ãã¿ã¹ã¯ã«é²ãããšãã§ããŸããå
šã³ãŒã #include <Eigen/Dense> #include <Eigen/Sparse> #include <string> #include <vector> #include <iostream> #include <fstream> struct Element { void CalculateStiffnessMatrix(const Eigen::Matrix3f& D, std::vector<Eigen::Triplet<float> >& triplets); Eigen::Matrix<float, 3, 6> B; int nodesIds[3]; }; struct Constraint { enum Type { UX = 1 << 0, UY = 1 << 1, UXY = UX | UY }; int node; Type type; }; int nodesCount; Eigen::VectorXf nodesX; Eigen::VectorXf nodesY; Eigen::VectorXf loads; std::vector< Element > elements; std::vector< Constraint > constraints; void Element::CalculateStiffnessMatrix(const Eigen::Matrix3f& D, std::vector<Eigen::Triplet<float> >& triplets) { Eigen::Vector3f x, y; x << nodesX[nodesIds[0]], nodesX[nodesIds[1]], nodesX[nodesIds[2]]; y << nodesY[nodesIds[0]], nodesY[nodesIds[1]], nodesY[nodesIds[2]]; Eigen::Matrix3f C; C << Eigen::Vector3f(1.0f, 1.0f, 1.0f), x, y; Eigen::Matrix3f IC = C.inverse(); for (int i = 0; i < 3; i++) { B(0, 2 * i + 0) = IC(1, i); B(0, 2 * i + 1) = 0.0f; B(1, 2 * i + 0) = 0.0f; B(1, 2 * i + 1) = IC(2, i); B(2, 2 * i + 0) = IC(2, i); B(2, 2 * i + 1) = IC(1, i); } Eigen::Matrix<float, 6, 6> K = B.transpose() * D * B * C.determinant() / 2.0f; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Eigen::Triplet<float> trplt11(2 * nodesIds[i] + 0, 2 * nodesIds[j] + 0, K(2 * i + 0, 2 * j + 0)); Eigen::Triplet<float> trplt12(2 * nodesIds[i] + 0, 2 * nodesIds[j] + 1, K(2 * i + 0, 2 * j + 1)); Eigen::Triplet<float> trplt21(2 * nodesIds[i] + 1, 2 * nodesIds[j] + 0, K(2 * i + 1, 2 * j + 0)); Eigen::Triplet<float> trplt22(2 * nodesIds[i] + 1, 2 * nodesIds[j] + 1, K(2 * i + 1, 2 * j + 1)); triplets.push_back(trplt11); triplets.push_back(trplt12); triplets.push_back(trplt21); triplets.push_back(trplt22); } } } void SetConstraints(Eigen::SparseMatrix<float>::InnerIterator& it, int index) { if (it.row() == index || it.col() == index) { it.valueRef() = it.row() == it.col() ? 1.0f : 0.0f; } } void ApplyConstraints(Eigen::SparseMatrix<float>& K, const std::vector<Constraint>& constraints) { std::vector<int> indicesToConstraint; for (std::vector<Constraint>::const_iterator it = constraints.begin(); it != constraints.end(); ++it) { if (it->type & Constraint::UX) { indicesToConstraint.push_back(2 * it->node + 0); } if (it->type & Constraint::UY) { indicesToConstraint.push_back(2 * it->node + 1); } } for (int k = 0; k < K.outerSize(); ++k) { for (Eigen::SparseMatrix<float>::InnerIterator it(K, k); it; ++it) { for (std::vector<int>::iterator idit = indicesToConstraint.begin(); idit != indicesToConstraint.end(); ++idit) { SetConstraints(it, *idit); } } } } int main(int argc, char *argv[]) { if ( argc != 3 ) { std::cout<<"usage: "<< argv[0] <<" <input file> <output file>\n"; return 1; } std::ifstream infile(argv[1]); std::ofstream outfile(argv[2]); float poissonRatio, youngModulus; infile >> poissonRatio >> youngModulus; Eigen::Matrix3f D; D << 1.0f, poissonRatio, 0.0f, poissonRatio, 1.0, 0.0f, 0.0f, 0.0f, (1.0f - poissonRatio) / 2.0f; D *= youngModulus / (1.0f - pow(poissonRatio, 2.0f)); infile >> nodesCount; nodesX.resize(nodesCount); nodesY.resize(nodesCount); for (int i = 0; i < nodesCount; ++i) { infile >> nodesX[i] >> nodesY[i]; } int elementCount; infile >> elementCount; for (int i = 0; i < elementCount; ++i) { Element element; infile >> element.nodesIds[0] >> element.nodesIds[1] >> element.nodesIds[2]; elements.push_back(element); } int constraintCount; infile >> constraintCount; for (int i = 0; i < constraintCount; ++i) { Constraint constraint; int type; infile >> constraint.node >> type; constraint.type = static_cast<Constraint::Type>(type); constraints.push_back(constraint); } loads.resize(2 * nodesCount); loads.setZero(); infile >> loadsCount; int loadsCount; for (int i = 0; i < loadsCount; ++i) { int node; float x, y; infile >> node >> x >> y; loads[2 * node + 0] = x; loads[2 * node + 1] = y; } std::vector<Eigen::Triplet<float> > triplets; for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) { it->CalculateStiffnessMatrix(D, triplets); } Eigen::SparseMatrix<float> globalK(2 * nodesCount, 2 * nodesCount); globalK.setFromTriplets(triplets.begin(), triplets.end()); ApplyConstraints(globalK, constraints); Eigen::SimplicialLDLT<Eigen::SparseMatrix<float> > solver(globalK); Eigen::VectorXf displacements = solver.solve(loads); outfile << displacements << std::endl; for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) { Eigen::Matrix<float, 6, 1> delta; delta << displacements.segment<2>(2 * it->nodesIds[0]), displacements.segment<2>(2 * it->nodesIds[1]), displacements.segment<2>(2 * it->nodesIds[2]); Eigen::Vector3f sigma = D * it->B * delta; float sigma_mises = sqrt(sigma[0] * sigma[0] - sigma[0] * sigma[1] + sigma[1] * sigma[1] + 3.0f * sigma[2] * sigma[2]); outfile << sigma_mises << std::endl; } return 0; }
clocãŠãŒãã£ãªãã£ãå®è¡ããŸãã
ã芧ã®ãšãããäœããããŸãã-171è¡ã®ã³ãŒããããã€ãã®åç
èšç®çµæãèŠèŠåããããã«ãå¿åå Žãæã€éå€åœ¢ããã³å€åœ¢ã¡ãã·ã¥ãæãPython ã¹ã¯ãªãããäœæãããŸãããæ®å¿µãªãããPILã䜿çšããŠã°ã©ããŒã·ã§ã³å¡ãã€ã¶ããè¡ãæ¹æ³ãããããŸããããã®ãããèŠçŽ å
ã®å¿åã¯ãäžå®ã®å¡ãã€ã¶ããšããŠè¡šç€ºãããŸããAbaqusã¯ãèŠãç®ã¯ããŸãçŸãããªããã®ã®ãããçå®ã«è¿ãæ¹æ³ã§èŠèŠåãè¡ãããšãã§ããŸãããã¹ãã¿ã¹ã¯ïŒ
ããè€éãªã°ãªãããååŸããããã«ãAbaqusã®ç¡æã®åŠççã䜿çšãããŸãããAbaqusã®å
¥åãã¡ã€ã«ã倿ããããã«ãå¥ã®ã¹ã¯ãªãããäœæãããŸããã確ãã«ãåºå®è·éãšå€éšè·éã¯æåã§èšå®ããå¿
èŠããããŸããããã§ã¯ã穎ãããããã®åºéšãåºå®ãããäžç«¯ã«åŒµåãå ããããŠããã¹ããªããããã
ãŸããçŸããã®ããã ãã®æœè±¡çãªèšèšèŠçŽ ã§ããæ§é ã®åºéšã¯åºå®ãããŠãããåçã®äžéšã«ãã§ã«æããäžéšã®çªåºéšã«éäžåãå ããããŠããŸãïŒ
穎ã®ããã¹ããªããã®å¥ã®äŸã§ã¯ã察称æ§ã®ããã«æ§é ã®4åã®1ã ããèæ
®ãããŸããå·Šã®å¢çç·ã¯xè»žã«æ²¿ã£ãŠåºå®ãããäžéšã¯yè»žã«æ²¿ã£ãŠåºå®ãããŸããæå€§åä¿¡é»å§ïŒ3.05152ãã®å€ã¯ãã°ãªããã®ç²ãã«ãé¢ãããïŒããããããã«ããïŒãçè«å€-3ã«éåžžã«è¿ãã§ãã
åãåé¡ãAbaqusã§è§£æ±ºãããŸãããã芧ã®ãšãããæå€§é»å§ã¯3.052ã§ãããããã¯çµæãšå®å
šã«äžèŽããŠããŸããå®éã«ã¯ãäžè§åœ¢èŠçŽ ãç¬èªã®æ¹æ³ã§äœããè¡ãããšã¯å°é£ã§ãããããçµæãç°ãªãããããã®ãããªæ£ç¢ºãªäžèŽã¯ååãšããŠé©ãã¹ãããšã§ã¯ãããŸãããæ®å¿µãªããã髿¬¡ã®èŠçŽ ã«ã€ããŠã¯ããã®100ïŒ
ã®äžèŽã¯ããŸããããŸããã§ãããããã¯ãæ°å€ç©åã®ç°ãªãå®è£
ã«ãã£ãŠèª¬æã§ããŸãã
äŸãå«ããã¹ãŠã®ãœãŒã¹ã³ãŒãã¯githubã§å
¥æã§ããŸããèå°è£ã«æ®ã£ãŠãããã®
æ£çŽãªãšãããå€ãã®ããšãèå°è£ã«æ®ãããŠããŸããããããèšäºã¯ãã§ã«èšããã§ããã®ã§ãããã§ãããããšãã§ãããšæããŸããå«ãŸããŠããŸããïŒãã ããå¿
èŠã§ããïŒïŒ- . , . . , ( 2- 4- ), . , ( ).
- .
- , .
- - , . , .
- , , .
- ç¯ç¹åã®å¹³è¡¡ãèæ
®ããããšã«ãããäžè¬çã«ãããã®ç¯ç¹åãé€å€ããŠãããäžè¬çãªæ¹æ³ãæ£åœåããããšãã§ããŸããã
MATLABãªã©ã®ææ°ã®æ°åŠããã±ãŒãžã«ã¯FEMãæäœããããã®ããŒã«ããããååãšããŠC ++ã§äœããèšè¿°ããå¿
èŠããªãããšã«å€ãã®äººãæ£ããæ°ä»ããšæããŸãããã ããããã§ã¯ãäŸåé¢ä¿ãæå°éã«æããæå°éã®å®è£
ãã€ãŸãããµãŒãããŒãã£ã®ããŒã«ã䜿çšããã«ããã¡ãããæ°åŠã©ã€ãã©ãªãé€ããŠãèªè
ã«äœ¿çšããããã¹ãŠã®æ©èœã¯éåžžã«éæã§ããå¿
èŠããããšæããŸããPSèšäºã¯å€§ããã®ã§ãPMã«ã¿ã€ããã¹ãå€ããšæããŸãã