* FOUR2TRI PROCEDUR BP208322 21/02/02 21:15:00 10876 *====================================================================== * * FOUR2TRI (ou 4 2 3 pour les numericiens purs....) : * Genere un maillage 3D à partir d'un modele Fourier * Recombine les CHPO 2D Fourier sur ce maillage 3D * Creation : D. Combescure, SEMT/DYN, CEA Saclay, Decembre 2006 * Modifs : B. Prabel, 2013/02(#8575), 2017/04(#9396), 2019/03, ... * *====================================================================== * opti debug 1; ************************************************************************ * LECTURE DES DONNEES D'ENTREE ************************************************************************ * * On ne cree le MAILLAGE_3D que s'il n'existe pas dejà * FLAGMAIL = VRAI; * il va falloir le creer -> a partir du modele ou d'un maillage 2d MESH2D = TAB1 . 'MAILLAGE'; SINON; * recup du maillage depuis le modele SINON; FINSI; FINSI; SINON; FLAGMAIL = FAUX; * le maillage existe deja -> on recupere tout MESH3D = TAB1 . 'MAILLAGE_3D' ; xy2D = TAB1 . 'COORDONNEES_2D'; xy3D = TAB1 . 'COORDONNEES_3D'; teta3D = TAB1 . 'ANGLE_3D' ; FINSI; * * On cree les champs de DEPLACEMENTS_3D si DEPLACEMENTS est fourni * * * On cree les champs de EFFORTS_3D si EFFORTS est fourni * * * On cree les champs sclaires de EFFORTS_3D si EFFORTS est fourni * * * * NUMFOUR = Harmonique de Fourier * *opti debug 1; list (TYPE NUMFOUR); list NUMFOUR; * est-on bien en Fourier ? MESS 'Harmonique de Fourier non fournie :' ' on prend l harmonique courante' ' ' NUMFOUR ' !'; SINON; * on n'est pas en Fourier -> on ne peut "que" faire le maillage 3D SI (FLAGDEPL OU FLAGFOR OU FLAGCHPS OU FLAGCHPA); FINSI; FINSI; FINSI; *mess 'four2tri: NUMFOUR='NUMFOUR; * * ANGLES * PRANGL = TAB1 . 'ANGLES'; SINON; TAB1 . 'ANGLES' = PRANGL; FINSI; * recup * on impose la 1ere valeur a 0° SI (NEG ANGL1 0.); FINSI; * amplitude de l'angle de rotation ANG_ROTA = ANGLN - ANGL1; * on impose une progression constante et croissante SI (MIN_D_ANG <EG 0.); MESS 'Les angles doivent suivre une progression croissante stricte !'; FINSI; SI ((MAX_D_ANG - MIN_D_ANG) > 0.1); MESS 'Les angles doivent suivre une progression arithmetique !'; FINSI; * revolution ? ZREVOLUTION = EGA ANG_ROTA 360.; SI (ZREVOLUTION); NROTA = NANGL - 1; SINON; NROTA = NANGL; FINSI; * * Faut-il redresser le maillage et les champs tq (r,\theta,z) = (X,Y,Z) * ou laisse t'on (r,\theta,z) = (X,-Z,Y) ? * REDRESS = TAB1 . 'REDRESSE'; SINON; REDRESS = FAUX; TAB1 . 'REDRESSE' = REDRESS; FINSI; * points central, vecteur de rotation pcentre = 0. 0. 0.; SI REDRESS; vrota1 = 0. 0. 1.; vrota2 = 1. 0. 0.; SINON; vrota1 = 0. 1. 0.; FINSI; * tolerance pour ELIM * rem : si xELIM = 0., alors pas d'ELIM, ce qui peut etre souhaitable * en cas de noeuds doubles volontaires par ex.) SINON; xELIM = 1.E-12 ; FINSI; FLAGELIM = xELIM '>' 0.; * xELIM etant utilise par ELIM et par MASQ et IPOL, * on met une autre valeur si nul ************************************************************************ * * CREATION DU MAILLAGE 3D * ************************************************************************ SI FLAGMAIL; * recup du maillage depuis le modele * fait+haut! MESH2D = EXTR MOD1 'MAILLAGE'; * on supprime les eventuels doublons (pour coque multicouche par ex.) * coordonnees 2D (R,Z) (logiquement, z2D = 0) avant redress ! * on redresse si besoin SI REDRESS; FINSI; * * elements geometriques surfaciques, lineaires et quadratiques TYPSURF = TYPSURF_LIN et TYPSURF_QUAD; * split de MESH2D en MESH2D_1 et MESH2D_2 selon le type d'element DONE = FAUX; DONE = VRAI; FINSI; DONE = VRAI; FINSI; SI (NON DONE); * par exemple, les elements de type RACCORD ne sont pas taites ici * (tant mieux car ils ont des noeuds confondus) FINSI; FIN Bj; * TODO: a ameliorer si ef quadratique ? pas sur que ce soit utile ... * infos utiles en cas d'appels successifs a FOUR2TRI TAB1 . 'COORDONNEES_2D' = xy2D; * creation effective du maillage 3D * VOLU ROTA pour les elements massifs SI (NEL_1 > 0); SI FLAGELIM; ELIM MESH3D_1 xELIM; FINSI; MESH3D = MESH3D ET MESH3D_1; FINSI; * ROTA pour les elements surfaciques SI (NEL_2 > 0); SI FLAGELIM; ELIM MESH3D_2 xELIM; FINSI; MESH3D = MESH3D ET MESH3D_2; FINSI; * les 1ers ELIM servaient aux noeuds en r=0 et en theta=0=360 degres * celui-ci aux noeuds communs a MESH3D_1 et MESH3D_2 SI FLAGELIM; SI ((NEL_1 * NEL_2) > 0); ELIM MESH3D_1 MESH3D_2 xELIM; FINSI; FINSI; * On range le(s) nouveau(x) maillage(s) 3D TAB1 . 'MAILLAGE_3D_MASSIF' = MESH3D_1; TAB1 . 'MAILLAGE_3D_COQUE' = MESH3D_2; TAB1 . 'MAILLAGE_3D' = MESH3D; * Reste a calculer les coordonnees 3D * pour teta, on evite les pb en r=0 avec un masque SI REDRESS; r3D = ((x3D**2) + (y3D**2))**0.5; teta3D = ATG y3D (x3D + mask0); SINON; r3D = ((x3D**2) + (z3D**2))**0.5; teta3D = ATG (-1.*z3D) (x3D + mask0); FINSI; TAB1 . 'COORDONNEES_3D' = xy3D; TAB1 . 'ANGLE_3D' = teta3D; FINSI; ************************************************************************ * * CHPO VECTEURS : CHAMPS DE | DEPLACEMENTS * | EFFORTS * ************************************************************************ * on evite du copier-coller en introduisant la boucle BITER NITER =0; SI (FLAGDEPL ET FLAGFOR); NITER = 2; FLAGDEPL = VRAI; FLAGFOR = FAUX; SINON; SI (FLAGDEPL OU FLAGFOR); NITER =1; FINSI; FINSI; REPE BITER NITER; SI FLAGDEPL; FINSI; SI FLAGFOR; FINSI; MESS 'L indice . ' ind3D 'existe deja : on l ecrase !'; SINON; FINSI; * il nous faut les cos() et sin() de \theta et n*\theta cosA1 = cos teta3D; sinA1 = sin teta3D; cosNA = cos (NUMFOUR * teta3D); sinNA = sin (NUMFOUR * teta3D); *-----------------------------> BOUCLE SUR LES DEPLACEMENTS REPETER LAB2 NDEP; i2 = &lab2; DEP2D = TAB1 . ind2D . i2; * serie de Fourier si (ega NUMFOUR 0); * ici, on considere seulement les ddls symetriques pour n=0 sinon; finsi; * changement de repere si REDRESS; DEP3D1 = DEP3D1 sinon; DEP3D1 = DEP3D1 finsi; * on stocke le nouveau deplacement 3D FIN LAB2; *-----------------------------> FIN DE BOUCLE SUR LES DEPLACEMENTS * SI (EGA NITER 2); SI (EGA &BITER 1); * pour la prochaine ITER FLAGDEPL=FAUX; FLAGFOR =VRAI; SINON; * on sort en remettant les valeurs par acquis de conscience FLAGDEPL=VRAI; FLAGFOR =VRAI; FINSI; FINSI; FIN BITER; ************************************************************************ * * CHPO SCALAIRE (ex : PRESSION, EPAISSEUR ...) : CAS |SYMETRIQUE * |ANTI-SYMETRIQUE * ************************************************************************ * on evite du copier-coller en introduisant la boucle BITER NITER =0; SI (FLAGCHPS ET FLAGCHPA); NITER = 2; FLAGCHPS = VRAI; FLAGCHPA = FAUX; SINON; SI (FLAGCHPS OU FLAGCHPA); NITER =1; FINSI; FINSI; REPE BITER NITER; * il nous faut les cos() ou sin() de n*\theta SI FLAGCHPS; cosinNA = cos (NUMFOUR * teta3D); FINSI; SI FLAGCHPA; cosinNA = sin (NUMFOUR * teta3D); FINSI; MESS 'L indice . ' ind3D 'existe deja : on l ecrase !'; SINON; FINSI; *-----------------------------> BOUCLE SUR LES CHPO REPETER LAB3 NCHPS; i3 = &lab3; CHP2D = TAB1 . ind2D . i3 ; * serie de Fourier CHP3D = CHP3D * cosinNA; * pas de changement de repere pour des champs scalaires * on stocke le champs 3D TAB1 . ind3D . i3 = CHP3D; FIN LAB3; *-----------------------------> FIN DE BOUCLE SUR LES CHPO SI (EGA NITER 2); SI (EGA &BITER 1); * pour la prochaine ITER FLAGCHPS=FAUX; FLAGCHPA=VRAI; SINON; * on sort en remettant les valeurs par acquis de conscience FLAGCHPS=VRAI; FLAGCHPA=VRAI; FINSI; FINSI; FIN BITER; ************************************************************************ * TODO : IL MANQUE LES CHAMPS DE CONTRAINTES ET DE DEFORMATIONS..... ************************************************************************ 'FINPROC'; *
© Cast3M 2003 - Tous droits réservés.
Mentions légales