* DEDUADAP PROCEDUR GOUNAND 24/09/18 21:15:02 12010 ************************************************************************ * NOM : DEDUADAP * * Opérateur DEDU option ADAP * -------------------------- * CHPO2 = 'DEDU' 'ADAP' MAIL (CHAM1) (RIG1 (CHPO1)) ; * * Objet : * _______ * * Génère un champ de déplacement permettant de régulariser un * maillage ou de l'adapter suivant une métrique sans changer * sa topologie. * * Commentaire : * _____________ * * MAIL : maillage à régulariser ou adapter * * CHAM1 : champ par élément aux noeuds donnant une métrique : * tenseur symétrique de composantes G11,G22,G12,... * (par défaut, le tenseur unité) * * RIG1 : Conditions sur les déplacements * CHPO1 (par défaut, on bloque les noeuds frontières de MAIL) * * CHPO2 : champ de déplacement. * * Notes : * _______ * * L'option 'ADAP' est censée fonctionner sans conditions sur le * maillage. * * Référence principale : * ______________________ * *@Article{huang4, * author = {Weizhang Huang}, * title = {Variational Mesh Adaptation: * Isotropy and Equidistribution}, * journal = {JCP}, * year = {2001}, * volume = {174}, * pages = {903-924}, * endroit = {Classeur Mesh Movement (VIIIb)} *} * * Je dois faire également un rapport technique... * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 05/04/2006, version initiale * HISTORIQUE : v1, 05/04/2006, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * Prière de PRENDRE LE TEMPS de compléter les commentaires * en cas de modification de ce sous-programme afin de faciliter * la maintenance ! ************************************************************************ * * * * Lecture des arguments * 'ARGUMENT' mail*'MAILLAGE' ; * 'ARGUMENT' rblo/'RIGIDITE' ; lrb = 'EXISTE' rblo ; 'SI' lrb ; 'SINON' ; lcb = FAUX ; 'FINSI' ; * 'IDIR' 'TINV' 'DENS' ; lchad = FAUX ; lchp = FAUX ; ldisg = FAUX ; theta = 0.2D0 ; gamma = 2.D0 ; *theta = 0.2D0 ; *gamma = 2.D0 ; itmax = 40 ; acccvg = VRAI ; lmg = FAUX ; lidir = FAUX ; ltinv = FAUX ; * 'REPETER' imotcle ; 'SI' ('NON' ('EXISTE' motcle)) ; 'QUITTER' imotcle ; 'FINSI' ; lmc = 'EXISTE' lmotcle motcle ; 'SI' ('NON' lmc) ; *1052 2 *Mot-cle incorrect "%M1:4". Voici la liste des valeurs admises : %M5:40 'FINSI' ; * 'SI' ('EGA' motcle 'METR') ; 'ARGUMENT' chad/'MCHAML' ; lchad = 'EXISTE' chad ; 'SI' ('NON' lchad) ; 'ARGUMENT' chp/'CHPOINT' ; lchp = 'EXISTE' chp ; 'SI' lchp ; 'FINS' ; 'SINON' ; lchp = FAUX ; 'FINSI' ; 'SINON' ; 'ARGUMENT' chp*'CHPOINT' ; chad0 = 0.*chad ; 'FINS' ; 'FINS' ; lchad = VRAI ; lchp = FAUX ; 'FINSI' ; 'FINSI' ; * 'SI' ('EGA' motcle 'DISG') ; ldisg = VRAI ; 'FINSI' ; * mvprec = '*' vprec -1. ; 'ARGUMENT' theta*'FLOTTANT' ; lok = 'ET' ('>' theta mvprec) ('<' theta ('+' 1. vprec)) ; 'SI' ('NON' lok) ; * 42 2 %m1:8 = %r1 non compris entre %r2 et %r3 'FINSI' ; 'FINSI' ; * 'SI' ('EGA' motcle 'GAMM') ; 'ARGUMENT' gamma*'FLOTTANT' ; lok = ('>' gamma ('-' 1.D0 vprec)) ; 'SI' ('NON' lok) ; * 41 2 %m1:8 = %r1 inferieur a %r2 'FINSI' ; 'FINSI' ; * 'SI' ('EGA' motcle 'NITM') ; 'ARGUMENT' itmax*'ENTIER' ; lok = ('>' itmax 0) ; 'SI' ('NON' lok) ; * 41 2 %m1:8 = %r1 inferieur a %r2 'FINSI' ; 'FINSI' ; * 'SI' ('EGA' motcle 'ACVG') ; 'ARGUMENT' acccvg*'LOGIQUE' ; 'FINSI' ; * 'SI' ('EGA' motcle 'METG') ; lmg = VRAI ; 'FINSI' ; * 'SI' ('EGA' motcle 'IDIR') ; 'ARGUMENT' idir*'ENTIER' ; lidir = VRAI ; 'FINSI' ; * 'SI' ('EGA' motcle 'TINV') ; 'ARGUMENT' tinv*'TABLE' ; ltinv = VRAI ; 'FINSI' ; * 'FIN' imotcle ; ladap = 'OU' lchad lchp ; * 'ARGUMENT' debug/'LOGIQUE' ; 'SI' ('NON' ('EXISTE' debug)) ; debug = FAUX ; 'FINSI' ; * * Initialisations * * 'SI' ('OU' ('<' idim 1) ('>' idim 3)) ; * 709 2 Fonction indisponible en dimension %i1. 'ERREUR' 709 'AVEC' idim ; 'FINSI' ; 'SI' (('EGA' imod 'AXIS') 'OU' ('EGA' imod 'UNIDAXIS') 'OU' ('EGA' imod 'FOUR') 'OU' ('EGA' imod 'SPHE')) ; *-105 0 Mode de calcul actuel %m1:32 * 710 2 Fonction indisponible pour ce mode de calcul 'FINSI' ; * vquaf = ('EGA' vtyp 'QUAF') ; 'SI' ('ET' ldisg ('NON' vquaf)) ; 'MESS' 'DISG option :' ; * 66 2 L'objet %m1:8 doit etre de type %m9:16 'FINSI' ; *'SI' ('ET' lchp ('NON' vquaf)) ; * 'MESS' 'METR+CHPO option :' ; ** 66 2 L'objet %m1:8 doit etre de type %m9:16 * 'ERRE' 66 'AVEC' 'MAIL QUAF' ; *'FINSI' ; * * Paramètres du solveur non-linéaire * * Evaluation de la matrice tangente * iktan = 1 : Matrice tangente exact (chère) * iktan = 2 : " approchée 1 (on néglige les termes extradiagonaux * (UX,FY)...) * (par défaut) * iktan = 3 : " approchée 2 (on néglige en plus les dérivées * extradiagonales (ddxi, ddeta)) * (ne fonctionne pas) * * Accélération de convergence * acccvg = VRAI : accélération à la PV * * Période de recalcul de la matrice tangente * rktan = i (toutes les i itérations non-linéaires) * * itmax : Nombre maxi d'itérations * rfonc : critère d'arrêt sur la variation de la fonctionnelle * fback : facteur divisif pour la relaxation lors d'un backtracking * nback : nombre maxi de backtracking * fvdet : critère pour le backtracking, variation maxi de la valeur * du jacobien iktan = 2 ; *!!!iktan = 1 ; rktan = 1 ; 'SI' debug ; rfonc = 5.D-8 ; 'SINON' ; rfonc = 5.D-2 ; 'FINSI' ; fback = 2.D0 ; fvdet = 4.D0 ; nback = 10 ; damp = 1.0D0 ; * * Maillage * 'SI' vquaf ; _mt = mail ; 'SINON' ; _mt = 'CHANGER' mail 'QUAF' ; 'FINSI' ; * * Inconnus et discrétisation * 'SI' ('NON' lmg) ; 'SI' ('EGA' vtyp 'LINE') ; methgau = 'GAR1' ; 'SINON' ; methgau = 'GAR2' ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' ldisg) ; gdisc = vtyp ; 'FINSI' ; * 'SI' ('OU' laxi lsph) ; 'SINON' ; 'FINSI' ; * * lpr = 'EXTRAIRE' lu lextr ; ldu = 'EXTRAIRE' lf lextr ; * * Métrique * 'SI' ladap; 'SI' lchad ; * $mt = 'MODE' _mt 'NAVIER_STOKES' 'QUAF' ; * chpmet = 'KCHA' $mt chad 'CHPO' 'QUAF' ; * metdisc = 'CSTE' ; * $mt = 'MODELISER' mail 'THERMIQUE' ; metdisc = gdisc ; 'FINSI' ; 'SI' lchp ; chpmet = chp ; 'SI' ('NON' lmetdisc) ; metdisc = gdisc ; 'FINS' ; 'FINSI' ; 'FINSI' ; * * Conditions aux limites sur les déplacements * 'SI' ('NON' lrb) ; 'SI' ('EGA' idim 1) ; * Faute de mieux : contour ne fonctionne pas en 1D 'FINSI' ; 'SI' ('EGA' idim 2) ; bord = 'CONTOUR' mail ; * rblo = 'BLOQUE' 'UX' 'UY' bord ; 'FINSI' ; 'SI' ('EGA' idim 3) ; bord = 'ENVELOPPE' mail ; * rblo = 'BLOQUE' 'UX' 'UY' 'UZ' bord ; 'FINSI' ; 'FINSI' ; * * Initilisations diverses * iniform = 'FORME' ; 'SI' ('EGA' tyde 'ENTIER') ; 'MESSAGE' chinfo ; * 426 2 Maillage incorrect 'FINSI' ; 'SI' ladap ; fonc0 = DEADFONC _mt gdisc methgau theta gamma chpmet metdisc 'ELEM' ; 'SI' lidir ; res = DEADRESI _mt gdisc methgau theta gamma ldu chpmet metdisc idir ; 'SINON' ; res = DEADRESI _mt gdisc methgau theta gamma ldu chpmet metdisc ; 'FINSI' ; 'SINON' ; 'SI' lidir ; 'SINON' ; 'FINSI' ; 'FINSI' ; dampi = damp ; fonci = fonc0 ; deti = det0 ; 'SI' acccvg ; znacce = 3 ; itdep = 3 ; acfp1 = 'COPIER' ('*' res 0.) ; acfp2 = acfp1 ; acfp3 = acfp1 ; acfep1 = acfp1; acfep2 = acfp1 ; correc=0.; freap = 0. ; 'FINSI' ; * * Algorithme non linéaire * cvgok = FAUX ; 'REPETER' it itmax ; 'SI' debug ; ch = 'CHAINE' ' Itération : ' &it ; 'MESSAGE' ch ; ch = 'CHAINE' ' dampi=' dampi ; 'MESSAGE' ch ; 'FINSI' ; * * Calcul du résidu * * partie liée à la fonctionnelle 'SI' ladap ; 'SI' lidir ; resf = DEADRESI _mt gdisc methgau theta gamma ldu chpmet metdisc idir ; 'SINON' ; resf = DEADRESI _mt gdisc methgau theta gamma ldu chpmet metdisc ; 'FINSI' ; 'SINON' ; 'SI' lidir ; 'SINON' ; 'FINSI' ; 'FINSI' ; * partie liée aux blocages resb = '*' rblo dx ; 'SI' lcb ; 'FINSI' ; res = resf '+' resb ; * acceleration de convergence 'SI' acccvg ; correcp = correc; correc = 0; acfp0 = 'ENLEVER' (res - freap) 'FLX' ; acfep0 = acfp0; acfep0 = acfep0 - correcp ; 'SI' ('>' &it itdep) ; 'SI' ('>' dampi ('*' damp 0.9)) ; 'SI' debug ; 'MESSAGE' 'Convergence acceleration' ; 'FINSI' ; correc = act3 acfep2 acfep1 acfep0 acfp3 acfp2 acfp1 acfp0 ; res = '-' res correc; 'FINSI' ; 'FINSI' ; 'FINSI' ; 'SI' ('>' &it 3) ; 'DETRUIT' acfp3 ; 'DETRUIT' acfep2 ; 'FINSI' ; acfp3 = acfp2 ; acfp2 = acfp1 ; acfp1 = acfp0 ; acfep2 = acfep1 ; acfep1 = acfep0 ; 'MENAGE' ; 'FINSI' ; * * Calcul de la matrice tangente * 'SI' ladap ; 'SI' lidir ; jac = DEADKTAN _mt gdisc methgau theta gamma lpr ldu chpmet metdisc iktan idir ; 'SINON' ; jac = DEADKTAN _mt gdisc methgau theta gamma lpr ldu iktan chpmet metdisc ; 'FINSI' ; 'SINON' ; 'SI' lidir ; jac = DEADKTAN _mt gdisc methgau theta gamma lpr ldu iktan idir ; 'SINON' ; jac = DEADKTAN _mt gdisc methgau theta gamma lpr ldu iktan ; 'FINSI' ; 'FINSI' ; jact = 'ET' jac rblo ; 'FINSI' ; * * Résolution du problème linéarisé * 'SI' ltinv ; mat smb = jact ('*' -1.D0 res) ; 'SI' ('EGA' (tinv . 'TYPINV') 0) ; sol = 'RESOUD' mat smb 'NOID' ; 'SINON' ; 'SI' ('EXISTE' tinv 'LTIME') ; ltime = tinv . 'LTIME' ; 'SINON' ; ltime = FAUX ; 'FINSI' ; * 'SI' ('EGA' ltime vrai) ; 'LISTE' tt ; 'SINON' ; 'FINSI' ; 'FINSI' ; ddx = sol ; 'SINON' ; 'FINSI' ; * 'LISTE' ddx ; * * * 'SI' acccvg ; * resx = 'ENLEVER' ('-' res (reac rblo ddx)) 'FLX' ; * resx2 = 'ENLEVER' (res) 'FLX' ; 'FINSI' ; * * Backtracking * backok = FAUX ; 'REPETER' iback nback ; 'SI' ('>' &iback 1) ; dampi = '/' dampi fback ; 'SI' debug ; ch = 'CHAINE' ' dampi=' dampi ; 'MESSAGE' ch ; 'FINSI' ; 'FINSI' ; ddxi = '*' ddx dampi ; * Test si le déplacement calculé inverse un jacobien * ou le change trop oldconf = 'FORME' ; 'FORME' depx ; 'FORME' oldconf ; 'SI' ('EGA' tyde 'ENTIER') ; 'SI' debug ; ch = 'CHAINE' ' Warning : inv. loc. jacobien !' ; 'MESSAGE' ch ; 'FINSI' ; 'SINON' ; vardet = ('/' detip deti) ; mivd = 'MINIMUM' vardet ; mavd = 'MAXIMUM' vardet ; 'SI' debug ; 'FINSI' ; bigvar = 'OU' ('>' mavd fvdet) ('<' mivd ('/' 1.D0 fvdet)) ; 'SI' bigvar ; 'SI' debug ; ch = 'CHAINE' ' Warn : trop grande variation du jaco !' ; 'MESSAGE' ch ; 'FINSI' ; 'SINON' ; backok = VRAI ; 'QUITTER' iback ; 'FINSI' ; 'FINSI' ; 'FIN' iback ; 'SI' ('NON' backok) ; chinfo1 = 'CHAINE' 'DEDUADAP : Backtracking failed to converge !' ; 'MESSAGE' chinfo1 ; chinfo2 = 'CHAINE' 'Please check the output displacement' 'MESSAGE' chinfo2 ; 'RESPRO' dep ; 'FINSI' ; dx = '+' dx ddxi ; 'FORME' depx ; 'SI' ladap ; foncip = DEADFONC _mt gdisc methgau theta gamma chpmet metdisc 'ELEM' ; 'SINON' ; 'FINSI' ; * * Critère de convergence * vrrfon = '/' ('-' foncip fonci) fonci ; critconv = 'MAXIMUM' vrrfon 'ABS' ; cvgok = ('<' critconv rfonc) ; 'SI' debug ; chmess = 'CHAINE' ' critere = ' critconv ; 'MESSAGE' chmess ; 'FINSI' ; deti = detip ; fonci = foncip ; 'SI' debug ; 'FINSI' ; 'SI' cvgok ; 'QUITTER' it ; 'FINSI' ; 'FIN' it ; 'FORME' iniform ; * itfin = ('-' &it 1) ; 'SI' debug ; ch = 'CHAINE' ' Iteration finale : ' itfin ; 'MESSAGE' ch ; 'REPETER' it itfin ; ('LOG' 10.D0) )) ; 'FIN' it ; titev = 'CHAINE' 'LOG10 Critere (iterations)' ; 'DESSIN' evres ; 'FINSI' ; * 'RESPRO' dep ; * * End of procedure file DEDUADAP * 'FINPROC' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales