$$$$ TOPORSTR * TOPORSTR PROCEDUR FD218221 23/11/29 21:15:14 11799 ************************************************************************ ** Procedure called by TOPOPTIM for applying geometric restrictions. ** ** Author: ** Guenhael Le Quilliec (LaMe - Polytech Tours) ** ** Version: ** 1.1 2021/03/19 Fixing a minor issue by adding 'SCALAIRE' type for the sensibility ** 1.0 2017/04/18 ************************************************************************ DEBP TOPORSTR tab0*'TABLE' ; * Criterion to fuse the nodes d0 = 1.0e-9 ; * Node mesh of the barycenters m0 = tab0.'WTABLE'.'MAILLAGE'.'GRAVITE' ; * Switch the sensitivity from element field to node field f0 = PROI m0 tab0.'WTABLE'.'SENSIBILITE' ; * Loop on each restriction REPE loop0 (DIME tab0.'RESTRICTIONS') ; * Find the next restriction SI (EXIS tab0.'RESTRICTIONS' &loop0) ; Rstr0 = tab0.'RESTRICTIONS'.&loop0 ; SINO ; QUIT loop0 ; FINS ; * Node mesh of the barycenters of the restricted zone * and its initial sensitivity RstrZ0 = EXIS Rstr0 'ZONE' ; SI RstrZ0 ; m1 = (REDU tab0.'WTABLE'.'UN'.(1) Rstr0.'ZONE') POIN 'SUPE' -1.0 ; ELIM m0 m1 d0 ; f1 = REDU f0 m1 ; SINO ; m1 = m0 ; f1 = f0 ; FINS ; * Make copies with the prescribed gometric transformation * Fuse the nodes of their supports * And get the mean sensitivity fields SI (EGA Rstr0.'TYPE' 'SYME_POIN') ; m2 f2 = m1 f1 SYME 'POIN' Rstr0.'POIN1' ; ELIM m1 m2 d0 ; f1 = (f1 + f2) / 2.0 ; FINS ; SI (EGA Rstr0.'TYPE' 'SYME_DROI') ; m2 f2 = m1 f1 SYME 'DROI' Rstr0.'POIN1' Rstr0.'POIN2' ; ELIM m1 m2 d0 ; f1 = (f1 + f2) / 2.0 ; FINS ; SI (EGA Rstr0.'TYPE' 'SYME_PLAN') ; m2 f2 = m1 f1 SYME 'PLAN' Rstr0.'POIN1' Rstr0.'POIN2' Rstr0.'POIN3' ; ELIM m1 m2 d0 ; f1 = (f1 + f2) / 2.0 ; FINS ; SI (EGA Rstr0.'TYPE' 'PERIODICITE_CIRCULAIRE') ; SI (Rstr0.'PERIODES' EGA 2) ; SI ((VALE 'DIME') EGA 3) ; m2 f2 = m1 f1 TOUR 180.0 Rstr0.'POIN1' Rstr0.'POIN2' ; SINO ; m2 f2 = m1 f1 TOUR 180.0 Rstr0.'POIN1' ; FINS ; ELIM m1 m2 d0 ; f1 = (f1 + f2) / 2.0 ; SINO ; msh0 = TABL ; msh0.(0) = m1 ; fld0 = TABL ; fld0.(0) = f1 ; p0 = Rstr0.'PERIODES' ; a0 = 360.0 / p0 ; SI ((VALE 'DIME') EGA 3) ; p1 = Rstr0.'POIN1' ; p2 = Rstr0.'POIN2' ; REPE loop1 (p0 - 1) ; old0 = &loop1 - 1 ; msh0.&loop1 fld0.&loop1 = msh0.old0 fld0.old0 TOUR a0 p1 p2 ; FIN loop1 ; SINO ; p1 = Rstr0.'POIN1' ; REPE loop1 (p0 - 1) ; old0 = &loop1 - 1 ; msh0.&loop1 fld0.&loop1 = msh0.old0 fld0.old0 TOUR a0 p1 ; FIN loop1 ; FINS ; REPE loop1 (p0 - 1) ; ELIM m1 msh0.&loop1 d0 ; f1 = f1 + fld0.&loop1 ; FIN loop1 ; f1 = f1 / p0 ; FINS ; FINS ; SI (EGA Rstr0.'TYPE' 'PERIODICITE_AXIALE') ; msh0 = TABL ; msh0.(0) = m1 ; fld0 = TABL ; fld0.(0) = f1 ; p0 = Rstr0.'PERIODES' ; v0 = Rstr0.'POIN2' MOIN Rstr0.'POIN1' ; REPE loop1 (p0 - 1) ; old0 = &loop1 - 1 ; msh0.&loop1 fld0.&loop1 = msh0.old0 fld0.old0 PLUS v0 ; loop2 = -1 * &loop1 ; old0 = loop2 + 1 ; msh0.loop2 fld0.loop2 = msh0.old0 fld0.old0 MOIN v0 ; FIN loop1 ; REPE loop1 (p0 - 1) ; ELIM m1 msh0.&loop1 d0 ; f1 = f1 + fld0.&loop1 ; loop2 = -1 * &loop1 ; ELIM m1 msh0.loop2 d0 ; f1 = f1 + fld0.loop2 ; FIN loop1 ; f1 = f1 / p0 ; FINS ; * Final sensitivity SI RstrZ0 ; f0 = f0 - (REDU f0 m1) + f1 ; SINO ; f0 = f1 ; FINS ; FIN loop0 ; * Switch the sensitivity from node field to element field SI (EXIS tab0.'WTABLE' 'MECANIQUE') ; mod1 = tab0.'WTABLE'.'MECANIQUE'.'MODELE'.(1) ; SINO ; mod1 = tab0.'WTABLE'.'THERMIQUE'.'MODELE'.(1) ; FINS ; tab0.'WTABLE'.'SENSIBILITE' = MANU 'CHML' mod1 'REPA' 'SCAL' (EXTR f0 'VALE') 'TYPE' 'SCALAIRE' 'GRAVITE' ; FINP ; $$$$