$$$$ TOPOCHAR * TOPOCHAR PROCEDUR FD218221 25/12/18 21:15:03 12429 ************************************************************************ ** Procedure called by TOPOPTIM for updating: ** - mechanical and thermal loadings, ** - boundary conditions (mechanical and thermal), ** - compliant mechanism springs. ** ** Author: ** Guenhael Le Quilliec (LaMe - Polytech Tours) ** ** Version: ** 1.0 2024/04/16 Previously part of TOPOBOOT, now called in the ** optimization loop to handle updates (e.g. if ** the loading depends on physical densities). ************************************************************************ * TODO voir pour ne mettre à jour que ce qui le nécessite via TOPOMODI * en particulier si TOPOUPDT est VRAI ? DEBP TOPOCHAR tab*'TABLE' ; * Input data * ********** Wtab = tab.'WTABLE' ; Ltab = Wtab.'LOGIQUE' ; * Loading updates whenever TOPOPTIM is called, or at each cycle if * PROCEDURE_TOPOUPDT is VRAI SI ((EGA Wtab.'ITERATION' 1) OU tab.'PROCEDURE_TOPOUPDT') ; res = Wtab.'RESOLUTION_B' ; * Mechanical boundary conditions nbrbdcM = 0 ; SI (EXIS res 'BLOCAGES_MECANIQUES') ; nbrbdcM = 1 ; bdcMB = res.'BLOCAGES_MECANIQUES' ; SI (EGA (TYPE bdcMB) 'TABLE') ; REPE itr (DIME bdcMB) ; SI (EXIS bdcMB &itr) ; nbrbdcM = &itr ; FINS ; FIN itr ; SI (EGA nbrbdcM 1) ; bdcMB = bdcMB.(1) ; FINS ; FINS ; FINS ; * Thermal boundary conditions nbrbdcT = 0 ; SI (EXIS res 'BLOCAGES_THERMIQUES') ; nbrbdcT = 1 ; bdcTB = res.'BLOCAGES_THERMIQUES' ; SI (EGA (TYPE bdcTB) 'TABLE') ; REPE itr (DIME bdcTB) ; SI (EXIS bdcTB &itr) ; nbrbdcT = &itr ; FINS ; FIN itr ; SI (EGA nbrbdcT 1) ; bdcTB = bdcTB.(1) ; FINS ; FINS ; FINS ; * Mechanical and thermal loadings nbrldg = 1 ; ldg = res.'CHARGEMENT' ; SI (EGA (TYPE ldg) 'TABLE') ; REPE itr (DIME ldg) ; SI (EXIS ldg &itr) ; nbrldg = &itr ; FINS ; FIN itr ; SI (EGA nbrldg 1) ; ldg = ldg.(1) ; FINS ; FINS ; * Loading modification detection SI (NON (EXIS res 'SENSIBILITE_NORMALISEE_CHARGEMENT')) ; SI ((TOPOMODI tab (CHAI 'CHARGEMENT') ldg) ET (Wtab.'ITERATION' > 1)) ; SAUT 1 'LIGN' ; MESS ' /!\ Le chargement a ete modifie depuis la precedente iteration.' ; MESS ' Si le chargement est dependant de la topologie, il faut' ; MESS ' alors aussi fournir sa sensibilite.' ; SAUT 1 'LIGN' ; FINS ; FINS ; * Compliant mechanism output loading nbrldg1 = 0 ; SI Ltab.'MECANISME' ; nbrldg1 = 1 ; ldg1 = tab.'MECANISME' ; SI (EGA (TYPE ldg1) 'TABLE') ; REPE itr (DIME ldg1) ; SI (EXIS ldg1 &itr) ; nbrldg1 = &itr ; FINS ; FIN itr ; SI (EGA nbrldg1 1) ; ldg1 = ldg1.(1) ; FINS ; FINS ; * Mechanism modification detection * SI (NON (EXIS res 'SENSIBILITE_NORMALISEE_MECANISME')) ; SI ((TOPOMODI tab (CHAI 'MECANISME') ldg) ET (Wtab.'ITERATION' > 1)) ; SAUT 1 'LIGN' ; MESS ' /!\ Le mechanisme a ete modifie depuis la precedente iteration.' ; MESS ' TOPOPTIM n''est pas compatible avec un mechanisme dependant' ; MESS ' de la topologie.' ; SAUT 1 'LIGN' ; FINS ; * FINS ; FINS ; * Number and names of components for forces and displacements SI Ltab.'MECANIQUE' ; modMB = Wtab.'MECANIQUE'.'MODELE_B' ; cpnldgM = EXTR modMB 'FORC' ; cpnU = EXTR modMB 'DEPL' ; nbrcpnM = DIME cpnU ; FINS ; * Number and names of components for thermal fluxes and temperatures SI Ltab.'THERMIQUE' ; modTB = Wtab.'THERMIQUE'.'MODELE_B' ; cpnldgT = EXTR modTB 'FORC' ; cpnT = EXTR modTB 'DEPL' ; nbrcpnT = DIME cpnT ; FINS ; * Multiple loads and/or boundary conditions cases nbrcas = MAXI (LECT nbrldg nbrldg1 nbrbdcT nbrbdcM) ; Wtab.'NB_CAS' = nbrcas ; Ltab.'CAS_MULTIPLES' = nbrcas > 1 ; SI Ltab.'CAS_MULTIPLES' ; SI (((nbrldg > 1) ET (NEG nbrldg nbrcas)) OU ((nbrldg1 > 1) ET (NEG nbrldg1 nbrcas)) OU ((nbrbdcT > 1) ET (NEG nbrbdcT nbrcas)) OU ((nbrbdcM > 1) ET (NEG nbrbdcM nbrcas))) ; MESS 'Le nombre de cas de charges ne correspond pas au nombre de cas de conditions aux limites.' ' Lorsque superieurs a 1, le nombre de cas de charge et de cas de conditions aux limites doivent correspondre.'; ERRE 'Veuillez verifier vos donnees d''entree.' ; FINS ; * Transform a single load into a table of identical loads SI (EGA nbrldg 1) ; tmp = TABL ; REPE itr nbrcas ; tmp.&itr = ldg ; FIN itr ; ldg = tmp ; FINS ; * Transform a single compliant mechanism load into a table of * identical compliant mechanism loads SI (EGA nbrldg1 1) ; tmp = TABL ; REPE itr nbrcas ; tmp.&itr = ldg1 ; FIN itr ; ldg1 = tmp ; FINS ; * Transform mechanica boundary conditions into a table of identical * mechanical boundary conditions SI (EGA nbrbdcM 1) ; tmp = TABL ; REPE itr nbrcas ; tmp.&itr = bdcMB ; FIN itr ; bdcMB = tmp ; FINS ; * Transform thermal boundary conditions into a table of identical * thermal boundary conditions SI (EGA nbrbdcT 1) ; tmp = TABL ; REPE itr nbrcas ; tmp.&itr = bdcTB ; FIN itr ; bdcTB = tmp ; FINS ; FINS ; Wtab.'CHARGEMENT' = ldg ; SI Ltab.'MECANISME' ; Wtab.'MECANISME' = ldg1 ; FINS ; SI Ltab.'MECANIQUE' ; Wtab.'MECANIQUE'.'BLOCAGES' = bdcMB ; FINS ; SI Ltab.'THERMIQUE' ; Wtab.'THERMIQUE'.'BLOCAGES' = bdcTB ; FINS ; SI Ltab.'MECANIQUE' ; SI Ltab.'THERMIQUE' ; SI Ltab.'CAS_MULTIPLES' ; REPE itr nbrcas ; Wtab.'MECANIQUE'.'CHARGEMENT' = TABL ; Wtab.'MECANIQUE'.'CHARGEMENT'.&itr = EXCO cpnldgM 'NOID' ldg.&itr ; FIN itr ; SINO ; Wtab.'MECANIQUE'.'CHARGEMENT' = EXCO cpnldgM 'NOID' ldg ; FINS ; SINO ; Wtab.'MECANIQUE'.'CHARGEMENT' = ldg ; FINS ; FINS ; SI Ltab.'THERMIQUE' ; SI Ltab.'MECANIQUE' ; SI Ltab.'CAS_MULTIPLES' ; REPE itr nbrcas ; Wtab.'THERMIQUE'.'CHARGEMENT' = TABL ; Wtab.'THERMIQUE'.'CHARGEMENT'.&itr = EXCO cpnldgT 'NOID' ldg.&itr ; FIN itr ; SINO ; Wtab.'THERMIQUE'.'CHARGEMENT' = EXCO cpnldgT 'NOID' ldg ; FINS ; SINO ; Wtab.'THERMIQUE'.'CHARGEMENT' = ldg ; FINS ; FINS ; * Springs used for compliant mechanism optimization SI Ltab.'MECANISME' ; SI Ltab.'CAS_MULTIPLES' ; spr = TABL ; REPE itr nbrcas ; spr.&itr = VIDE 'RIGIDITE'/'RIGIDITE' ; SI Ltab.'PASAPAS' ; tmp = EXTR (DIME savtim) savtim ; tmp = (TIRE ldg.&itr tmp) + (TIRE ldg1.&itr tmp) ; SINO ; tmp = ldg.&itr + ldg1.&itr ; FINS ; tmp1 = EXTR tmp 'MAIL' ; tmp2 = NBNO tmp1 ; REPE itr1 nbrcpnM ; tmp3 = EXTR cpnldgM &itr1 ; tmp4 = EXTR cpnU &itr1 ; REPE itr2 tmp2 ; tmp5 = tmp1 POIN &itr2 ; tmp6 = (ABS (EXTR tmp tmp3 tmp5)) * 0.1 ; spr.&itr = spr.&itr ET (APPU tmp4 tmp6 tmp5) ; FIN itr2 ; FIN itr1 ; FIN itr ; SINO ; spr = VIDE 'RIGIDITE'/'RIGIDITE' ; SI Ltab.'PASAPAS' ; tmp = EXTR (DIME savtim) savtim ; tmp = (TIRE ldg tmp) + (TIRE ldg1 tmp) ; SINO ; tmp = ldg + ldg1 ; FINS ; tmp1 = EXTR tmp 'MAIL' ; tmp2 = NBNO tmp1 ; REPE itr nbrcpnM ; tmp3 = EXTR cpnldgM &itr ; tmp4 = EXTR cpnU &itr ; REPE itr1 tmp2 ; tmp5 = tmp1 POIN &itr1 ; tmp6 = (ABS (EXTR tmp tmp3 tmp5)) * 0.1 ; spr = spr ET (APPU tmp4 tmp6 tmp5) ; FIN itr1 ; FIN itr ; FINS ; Wtab.'RESSORTS' = spr ; FINS ; FINS ; FINP ; $$$$