* TOPOBOOT PROCEDUR PV090527 24/01/10 21:15:06 11818 * TOPOBOOT PROCEDUR CB215821 21/04/22 14:10:01 9715 ************************************************************************ ** Procedure called by TOPOPTIM for preprocessing the input data. ** ** Author: ** Guenhael Le Quilliec (LaMe - Polytech Tours) ** ** Version: ** 2.0 2021/04/22 Making the procedure compatible with Cast3M-2020 ** for linear resolution with thermo-mechanical loading ** 1.0 2021/04/15 ************************************************************************ DEBP TOPOBOOT tab0*'TABLE' ; * Working table initialization * **************************** wtab0 = tab0.'WTABLE' ; * Boolean variables bool0 = wtab0.'BOOL' ; * Mesh, model, boundary conditions and loading * ******************************************** * Table of the finite element model data mdl0 = tab0.'RESOLUTION_PASAPAS' ; SINO ; mdl0 = tab0.'RESOLUTION_LINEAIRE' ; FINS ; wtab0.'RESOLUTION'.(0) = mdl0 ; * Mechanical boundary conditions bcM_nb0 = 0 ; bcM_nb0 = 1 ; bcM0 = mdl0.'BLOCAGES_MECANIQUES' ; bcM_nb0 = &loop0 ; FINS ; FIN loop0 ; SI (EGA bcM_nb0 1) ; bcM0 = bcM0.(1) ; FINS ; FINS ; FINS ; * Thermal boundary conditions bcT_nb0 = 0 ; bcT_nb0 = 1 ; bcT0 = mdl0.'BLOCAGES_THERMIQUES' ; bcT_nb0 = &loop0 ; FINS ; FIN loop0 ; SI (EGA bcT_nb0 1) ; bcT0 = bcT0.(1) ; FINS ; FINS ; FINS ; * Loading load_nb0 = 1 ; load0 = mdl0.'CHARGEMENT' ; load_nb0 = &loop0 ; FINS ; FIN loop0 ; SI (EGA load_nb0 1) ; load0 = load0.(1) ; FINS ; FINS ; * Model mod0 = mdl0.'MODELE' ; bool0.'MECANIQUE' = mecha0 ; SI mecha0 ; wtab0.'MECANIQUE'.'MODELE'.(0) = modM0 ; FINS ; bool0.'THERMIQUE' = therm0 ; SI therm0 ; wtab0.'THERMIQUE'.'MODELE'.(0) = modT0 ; FINS ; bool0.'CONTACT' = cntct0 ; SI cntct0 ; wtab0.'CONTACT'.'MODELE'.(0) = modC0 ; FINS ; * Material mat0 = mdl0.'CARACTERISTIQUES' ; SI mecha0 ; wtab0.'MECANIQUE'.'CARACTERISTIQUES'.(0) = matM0 ; FINS ; SI therm0 ; wtab0.'THERMIQUE'.'CARACTERISTIQUES'.(0) = matT0 ; FINS ; SI cntct0 ; wtab0.'CONTACT'.'CARACTERISTIQUES'.(0) = matC0 ; FINS ; * Mesh (without Contact mesh, only Mechanic and/or Thermic) SI mecha0 ; SINO ; FINS ; wtab0.'MAILLAGE'.(0) = msh0 ; SI cntct0 ; FINS ; * Check that the number of elements of each mesh (thermal and mecha) * equals that of the global mesh otherwise the procedure can't work SI (mecha0 ET therm0) ; ERRE 'Veuillez adapter vos modeles en consequence.' ; FINS ; FINS ; * Compliant mechanism topology optimization bool0.'MECANISME' = mcn0 ; * Compliant mechanism output loading load_nb1 = 0 ; SI mcn0 ; load_nb1 = 1 ; load1 = tab0.'MECANISME' ; load_nb1 = &loop0 ; FINS ; FIN loop0 ; SI (EGA load_nb1 1) ; load1 = load1.(1) ; FINS ; FINS ; FINS ; * Solve the problem also without springs tab0.'MECANISME_ZERO_SPRING' = FAUX ; FINS ; * Check that a mechanical model exists SI (mcn0 ET (NON mecha0)) ; MESS 'Pour effectuer une optimisation de mecanisme deformable, il faut imperativement preciser un modele mecanique.' ; ERRE 'Veuillez preciser le modele mecanique a utiliser.' ; FINS ; * General optimization options * **************************** * Frozen area bool0.'ZONE_FIGEE' = froz0 ; SI froz0 ; msh2 = tab0.'ZONE_FIGEE' ; SI mecha0 ; wtab0.'MECANIQUE'.'MODELE'.(2) = modM2 ; wtab0.'MECANIQUE'.'CARACTERISTIQUES'.(2) = matM2 ; FINS ; SI therm0 ; wtab0.'THERMIQUE'.'MODELE'.(2) = modT2 ; wtab0.'THERMIQUE'.'CARACTERISTIQUES'.(2) = matT2 ; FINS ; SINO ; msh1 = msh0 ; SI mecha0 ; modM1 = modM0 ; matM1 = matM0 ; FINS ; SI therm0 ; modT1 = modT0 ; matT1 = matT0 ; FINS ; FINS ; wtab0.'MAILLAGE'.(1) = msh1 ; SI mecha0 ; wtab0.'MECANIQUE'.'MODELE'.(1) = modM1 ; wtab0.'MECANIQUE'.'CARACTERISTIQUES'.(1) = matM1 ; FINS ; SI therm0 ; wtab0.'THERMIQUE'.'MODELE'.(1) = modT1 ; wtab0.'THERMIQUE'.'CARACTERISTIQUES'.(1) = matT1 ; FINS ; SI mecha0 ; wtab0.'MODELE'.(0) = modM0 ; wtab0.'MODELE'.(1) = modM1 ; SI froz0 ; wtab0.'MODELE'.(2) = modM2 ; FINS ; SINO ; wtab0.'MODELE'.(0) = modT0 ; wtab0.'MODELE'.(1) = modT1 ; SI froz0 ; wtab0.'MODELE'.(2) = modT2 ; FINS ; FINS ; * Ratio between the mechanical stiffness of the voids and the material SI (mcn0 OU therm0) ; tab0.'RAPPORT_RAIDEURS_MECANIQUES' = 1.0e-8 ; SINO ; tab0.'RAPPORT_RAIDEURS_MECANIQUES' = 0.0 ; FINS ; FINS ; * Ratio between the thermal stiffness of the voids and the material tab0.'RAPPORT_RAIDEURS_THERMIQUES' = 0.001 ; FINS ; * Minimal threshold value of the topology field to save elements tab0.'SEUIL' = 1.0e-9 ; FINS ; * Volume fraction tab0.'FRACTION_VOLUME' = 0.4 ; FINS ; volfrac0 = FLOT tab0.'FRACTION_VOLUME' ; * Personal procedure that can be used, amongst others, to * calculate/modify the sensibility field and objective value tab0.'PROCEDURE_TOPOPERS' = FAUX ; FINS ; * Weights tab0.'POIDS_MECANISME' = 1.0 ; FINS ; SI mcn0 ; tab0.'POIDS_ENERGIE_DEFO' = 0.0 ; SINO ; tab0.'POIDS_ENERGIE_DEFO' = 1.0 ; FINS ; FINS ; SI mcn0 ; tab0.'POIDS_TEMPERATURE' = 0.0 ; SINO ; tab0.'POIDS_TEMPERATURE' = 1.0 ; FINS ; FINS ; * Procedure to add a geometric restrictions * Number of the last completed cycle tab0.'CYCLE' = 0 ; FINS ; cy0 = (ENTI (tab0.'CYCLE')) + 1 ; wtab0.'CYCLE' = cy0 ; * Maximum number of optimization cycles tab0.'MAX_CYCLES' = 100 ; FINS ; * Filter type FINS ; * Parameters for matrix filter type SI (EGA tab0.'FILTRE' 'MATRICE'); * Filter radius ERRE 'Veuillez preciser un rayon de filtrage.' ; FINS ; * Filter exponent tab0.'FILTRE_EXPOSANT' = 1.0 ; FINS ; * Filter weight minimum threshold tab0.'FILTRE_CRITERE' = 0.0 ; FINS ; * Number of POINTEUR of the mesh for detecting remeshing tab0.'WTABLE'.'MFIL_POINTEUR' = -1 ; FINS ; * Parameters for Gibiane filter type SI (EGA tab0.'FILTRE' 'GIBIANE'); * Filter rate tab0.'FILTRE_TAUX' = 1 ; FINS ; FINS ; * Convergence criterion tab0.'CRITERE' = 0.01 ; FINS ; * Maximum increment of the topology field between two cycles tab0.'TOPOLOGIE_MAX_INC' = 0.2 ; FINS ; * Topology minimum value of the optimality criterion method SI mcn0 ; tab0.'TOPOLOGIE_MIN' = 0.001 ; SINO ; tab0.'TOPOLOGIE_MIN' = 0.0 ; FINS ; FINS ; * Optimality criterion (OC) * ************************* * Initial lower bound for the Lagrangian multiplier tab0.'OC_L1' = 0.0 ; FINS ; * Initial upper bound for the Lagrangian multiplier *SI (NON (EXIS tab0 'OC_L2')) ; * tab0.'OC_L2' = 1.0e5 ; *FINS ; * Minimal value for the upper bound tab0.'OC_L2_MIN' = 1.0e-40 ; FINS ; * Convergence criterion for the bi-sectioning algorithm tab0.'OC_CRITERE' = 1.0e-8 ; FINS ; * Maximum number of iterations for the bi-sectioning algorithm tab0.'OC_MAX_IT' = 100000; FINS ; * Lower bound for B (where B**D is the ratio between the new and the * previous topology fields) tab0.'OC_B_MIN' = 1.0e-10 ; FINS ; * Damping factor (D) * ****************** tab0.'FACTEUR_D' = 0.5 ; FINS ; SI (NON bool0.'FACTEUR_D_EVOL') ; wtab0.'FACTEUR_D' = tab0.'FACTEUR_D' ; FINS ; * Penalty factor (P) * ****************** * Start value of P tab0.'FACTEUR_P' = 3.0 ; FINS ; SI (NON bool0.'FACTEUR_P_EVOL') ; wtab0.'FACTEUR_P' = tab0.'FACTEUR_P' ; FINS ; * Grey Scale Factor (Q) * ********************* * Start value of Q tab0.'FACTEUR_Q' = 1.0 ; FINS ; SI (NON bool0.'FACTEUR_Q_EVOL') ; wtab0.'FACTEUR_Q' = tab0.'FACTEUR_Q' ; FINS ; * Complementary options * ********************* * Only for step by step resolution * Save time list SINO ; SavTime0 = mdl0.'TEMPS_SAUVES' ; FINS ; wtab0.'TEMPS_SAUVES' = SavTime0 ; * Number of steps FINS ; * Numerical precision tab0.'PRECISION' = 1.0e-9 ; FINS ; * Division by zero protection tab0.'ZERO_DIVISION' = 0.001 ; FINS ; zdiv0 = tab0.'ZERO_DIVISION' ; * Draw topology FINS ; * Convergence tab0.'CONVERGENCE' = FAUX ; * Cycles to be saved FINS ; * Data to be saved FINS ; tab0.'MES_SAUVEGARDES'.'TOPOLOGIE' = VRAI ; FINS ; tab0.'MES_SAUVEGARDES'.'MAILLAGE' = VRAI ; FINS ; tab0.'MES_SAUVEGARDES'.'RESOLUTION' = FAUX ; FINS ; * Topology output table FINS ; * Mesh output table FINS ; * Resolution output table FINS ; ********************************************************************** * PREPROCESSING * ********************************************************************** * Various element fields * ********************** * Mechanical model element fields SI mecha0 ; * Unitary field * Volume of each element * Change the unitary field so that is not considered as constant * to avoid problems with the function POIN 'SUPE' unM1 = volElM1 / volElM1 ; wtab0.'MECANIQUE'.'UN'.(1) = unM1 ; wtab0.'MECANIQUE'.'VOLUME'.(1) = volElM1 ; SI froz0 ; * Unitary field * Volume of each element wtab0.'MECANIQUE'.'UN'.(2) = unM2 ; wtab0.'MECANIQUE'.'VOLUME'.(2) = volElM2 ; FINS ; FINS ; * Thermal model element fields SI therm0 ; * Unitary field * Volume of each element * In thermal mode, 'GRAVITE' option is not respected * This problem is solved by INTG 'ELEM' divided by itself * This also change the unitary field so that is not considered as * constant to avoid problems with the function POIN 'SUPE' unT1 = volElT1 / volElT1 ; wtab0.'THERMIQUE'.'UN'.(1) = unT1 ; wtab0.'THERMIQUE'.'VOLUME'.(1) = volElT1 ; SI froz0 ; * Unitary field * Volume of each element * In thermal mode, 'GRAVITE' option is not respected * This problem is solved by INTG 'ELEM' divided by itself unT2 = volElT2 / volElT2 ; wtab0.'THERMIQUE'.'UN'.(2) = unT2 ; wtab0.'THERMIQUE'.'VOLUME'.(2) = volElT2 ; FINS ; FINS ; * Default fields SI mecha0 ; un1 = unM1 ; SI froz0 ; un2 = unM2 ; FINS ; SINO ; un1 = unT1 ; SI froz0 ; un2 = unT2 ; FINS ; FINS ; wtab0.'UN'.(1) = un1 ; SI froz0 ; wtab0.'UN'.(2) = un2 ; FINS ; SI mecha0 ; wtab0.'MECANIQUE'.'CHAMP_MIN' = un1 * tab0.'RAPPORT_RAIDEURS_MECANIQUES' ; FINS ; SI therm0 ; wtab0.'THERMIQUE'.'CHAMP_MIN' = un1 * tab0.'RAPPORT_RAIDEURS_THERMIQUES' ; FINS ; * Node mesh of the barycenters * Zero point field * Initial volumes SI froz0 ; SI mecha0 ; SINO ; FINS ; wtab0.'VOLUME'.(0) = vol1 + vol2 ; SINO ; SI mecha0 ; SINO ; FINS ; wtab0.'VOLUME'.(0) = vol1 ; FINS ; wtab0.'VOLUME'.(1) = vol1 ; * Initial topology SI mecha0 ; * Express the input topology element field at the barycenters of * the elements of the model modM1 SINO ; * Express the input topology element field at the barycenters of * the elements of the model modT1 * In thermal mode, 'GRAVITE' option is not respected * This problem is solved by INTG 'ELEM' FINS ; SINO ; SI (NEG cy0 1) ; ERRE 'Veuillez preciser la topologie du cycle precedent.' ; SINO ; x0 = un1 * volfrac0 ; FINS ; FINS ; wtab0.'TOPOLOGIE' = x0 ; * Number and name of the components for the forces and the displacements SI mecha0 ; FINS ; * Number and name of the components for the thermal flux and the temperature SI therm0 ; FINS ; * Multiple cases of loads and/or boundary conditions wtab0.'NB_CAS' = case_nb0 ; bool0.'CAS_MULTIPLES' = case_nb0 > 1 ; SI bool0.'CAS_MULTIPLES' ; SI (((load_nb0 > 1) ET (NEG load_nb0 case_nb0)) OU ((load_nb1 > 1) ET (NEG load_nb1 case_nb0)) OU ((bcT_nb0 > 1) ET (NEG bcT_nb0 case_nb0)) OU ((bcM_nb0 > 1) ET (NEG bcM_nb0 case_nb0))) ; 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 list of identical loads in a table SI (EGA load_nb0 1) ; REPE loop0 case_nb0 ; tmp0.&loop0 = load0 ; FIN loop0 ; load0 = tmp0 ; FINS ; * Transform a single load into a list of identical loads in a table SI (EGA load_nb1 1) ; REPE loop0 case_nb0 ; tmp0.&loop0 = load1 ; FIN loop0 ; load1 = tmp0 ; FINS ; * Transform mecha. BC into a list of identical mecha. BC in a table SI (EGA bcM_nb0 1) ; REPE loop0 case_nb0 ; tmp0.&loop0 = bcM0 ; FIN loop0 ; bcM0 = tmp0 ; FINS ; * Transform therm. BC into a list of identical therm. BC in a table SI (EGA bcT_nb0 1) ; REPE loop0 case_nb0 ; tmp0.&loop0 = bcT0 ; FIN loop0 ; bcT0 = tmp0 ; FINS ; FINS ; wtab0.'CHARGEMENT' = load0 ; SI mcn0 ; wtab0.'MECANISME' = load1 ; FINS ; SI mecha0 ; wtab0.'MECANIQUE'.'BLOCAGES' = bcM0 ; FINS ; SI therm0 ; wtab0.'THERMIQUE'.'BLOCAGES' = bcT0 ; FINS ; SI mecha0 ; SI therm0 ; SI bool0.'CAS_MULTIPLES' ; REPE loop0 case_nb0 ; FIN loop0 ; SINO ; FINS ; SINO ; wtab0.'MECANIQUE'.'CHARGEMENT' = load0 ; FINS ; FINS ; SI therm0 ; SI mecha0 ; SI bool0.'CAS_MULTIPLES' ; REPE loop0 case_nb0 ; FIN loop0 ; SINO ; FINS ; SINO ; wtab0.'THERMIQUE'.'CHARGEMENT' = load0 ; FINS ; FINS ; * Springs for the compliant mechanism optimization SI mcn0 ; SI bool0.'CAS_MULTIPLES' ; REPE loop0 case_nb0 ; SINO ; tmp0 = load0.&loop0 + load1.&loop0 ; FINS ; REPE loop1 CompMNb0 ; REPE loop2 tmp2 ; FIN loop2 ; FIN loop1 ; FIN loop0 ; SINO ; SINO ; tmp0 = load0 + load1 ; FINS ; REPE loop0 CompMNb0 ; REPE loop1 tmp2 ; FIN loop1 ; FIN loop0 ; FINS ; wtab0.'RESSORTS' = Spr0 ; FINS ; * Initializations needed for the cleaning at the begining of the first cycle wtab0.'MAILLAGE'.'A' = 0 ; SI mecha0 ; wtab0.'MECANIQUE'.'MODELE'.'A' = 0 ; wtab0.'MECANIQUE'.'CARACTERISTIQUES'.'A' = 0 ; FINS ; SI therm0 ; wtab0.'THERMIQUE'.'MODELE'.'A' = 0 ; wtab0.'THERMIQUE'.'CARACTERISTIQUES'.'A' = 0 ; FINS ; SI cntct0 ; wtab0.'CONTACT'.'MODELE'.'A' = 0 ; wtab0.'CONTACT'.'CARACTERISTIQUES'.'A' = 0 ; FINS ; wtab0.'RESOLUTION'.'A' = 0 ; FINP ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales