Télécharger stokes_lagaug.dgibi
* fichier stokes_lagaug.dgibi ************************************************************************ ************************************************************************ * * 'SAUTER' 2 'LIGNE' ; 'MESSAGE' ' Execution de stokes_lagaug.dgibi' ; 'SAUTER' 2 'LIGNE' ; * graph = faux ; interact = faux ; ************************************************************************ * NOM : STOKES_LAGAUG * DESCRIPTION : Cas-test équation de Stokes incompressible * Méthode directe et de Lagrangien augmenté pour les * contraintes de divergence. * Cavité carrée entrainee * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 10/06/2011, version initiale * HISTORIQUE : v1, 10/06/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ ************************************************************************ * * * PROCEDURES * * ************************************************************************ * * * 'DEBPROC' ERRREL ; 'ARGUMENT' val*'FLOTTANT' ; 'ARGUMENT' valref*'FLOTTANT' ; * 'SI' ('<' ('ABS' valref) 1.D-10) ; echref = 1.D0 ; 'SINON' ; echref = valref ; 'FINSI' ; * errabs = 'ABS' ('/' ('-' val valref) echref); * 'RESPRO' errabs ; * * End of procedure file ERRREL * 'FINPROC' ; *ENDPROCEDUR errrel *BEGINPROCEDUR quafme ************************************************************************ * NOM : QUAFME * DESCRIPTION : * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 01/12/2004, version initiale * HISTORIQUE : v1, 01/12/2004, 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 ! ************************************************************************ * * 'DEBPROC' QUAFME ; 'ARGUMENT' tmail/'TABLE' ; 'SI' ('NON' ('EXISTE' tmail)) ; tmail = 'TABLE' ; 'FINSI' ; 'REPETER' bcl ; 'ARGUMENT' mquad/'MAILLAGE' ; 'SI' ('EXISTE' mquad) ; 'REPETER' bbcl 1 ; tmail . nom = 'TABLE' ; 'SI' ('EGA' dimm 0) ; mquaf = mquad ; tmail . nom = mquad ; 'QUITTER' bbcl ; 'FINSI' ; 'SI' ('EGA' typm 'QUAF') ; mquaf = mquad ; tmail . nom . 'QUAF' = mquaf ; 'SI' ('EGA' dimm 2) ; tmail . nom . 'QUAI' = mquaf ; tmail . nom . 'QUAD' = mquaf ; 'FINSI' ; 'QUITTER' bbcl ; 'FINSI' ; 'SI' ('EGA' typm 'QUAI') ; mquaf = 'CHANGER' mquad 'QUAF' ; tmail . nom . 'QUAF' = mquaf ; tmail . nom . 'QUAI' = mquad ; tmail . nom . 'LINE' = 'CHANGER' 'LINEAIRE' mquad ; 'QUITTER' bbcl ; 'FINSI' ; 'SI' ('EGA' typm 'LINE') ; mquai = 'CHANGER' 'QUADRATIQUE' mquad ; mquaf = 'CHANGER' mquai 'QUAF' ; tmail . nom . 'QUAF' = mquaf ; tmail . nom . 'QUAI' = mquai ; tmail . nom . 'LINE' = mquad ; 'QUITTER' bbcl ; 'FINSI' ; 'FIN' bbcl ; * ielim = '+' ielim 1 ; * telim . ielim = mquaf ; 'SINON' ; 'QUITTER' bcl ; 'FINSI' ; 'FIN' bcl ; * * telim = 'TABLE' 'ESCLAVE' ; ielim = 0 ; tidx = 'INDEX' tmail ; idx = tidx . &iidx ; val = tmail . idx ; 'SI' ('EGA' tval 'MAILLAGE') ; ielim = '+' ielim 1 ; telim . ielim = val ; 'FINSI' ; 'SI' ('EGA' tval 'TABLE') ; 'SI' ('EXISTE' val 'QUAF') ; ielim = '+' ielim 1 ; telim . ielim = val . 'QUAF' ; 'FINSI' ; 'FINSI' ; 'FIN' iidx ; * * 'ARGUMENT' tol*'FLOTTANT' ; 'ELIMINATION' ('ET' telim) tol ; * 'RESPRO' tmail ; 'FINPROC' ; * * End of procedure file QUAFME * *ENDPROCEDUR quafme *BEGINPROCEDUR modenlin ************************************************************************ * NOM : MODENLIN * DESCRIPTION : * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, ??/??/2007, version initiale * HISTORIQUE : v1, ??/??/2007, 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 ! ************************************************************************ * * 'DEBPROC' MODENLIN ; * * 'SI' ('ET' ('NEG' vdim 2) ('NEG' vdim 3)) ; 'ERREUR' ('CHAINE' 'vdim=' vdim) ; 'FINSI' ; * * Noms par défaut * 'SI' ('EGA' vdim 2) ; 'SI' ('NEG' vmod 'AXIS') ; 'SINON' ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' vdim 3) ; 'FINSI' ; * *nomflu = 'MOTS' 'SCAL' ; * 'ARGUMENT' tmode/'TABLE' ; 'SI' ('NON' ('EXISTE' tmode)) ; tmode = 'TABLE' ; * * Initialisation des inconnues par défaut * mdisc = 'EXTRAIRE' lmdisc &iidisc ; tmode . mdisc = 'TABLE' ; tmode . mdisc . 'DISC' = mdisc ; tmode . mdisc . 'NOMPRI' = 'TABLE' ; tmode . mdisc . 'NOMPRI' . 1 = nomsca ; tmode . mdisc . 'NOMDUA' = 'TABLE' ; tmode . mdisc . 'NOMDUA' . 1 = nomsca ; mdiscv = 'CHAINE' mdisc 'V' ; tmode . mdiscv = 'TABLE' ; tmode . mdiscv . 'DISC' = mdisc ; tmode . mdiscv . 'NOMPRI' = 'TABLE' ; 'REPETER' idim vdim ; TMODE . mdiscv. 'NOMPRI' . &idim = 'FIN' idim ; tmode . mdiscv . 'NOMDUA' = 'TABLE' ; 'REPETER' idim vdim ; TMODE . mdiscv. 'NOMDUA' . &idim = 'FIN' idim ; 'FIN' iidisc ; 'FINSI' ; * * Lecture des mots clés et des inconnues * 'REPETER' imotcle ; 'SI' ('NON' ('EXISTE' motcle)) ; 'QUITTER' imotcle ; 'FINSI' ; 'SI' ('NON' ('EXISTE' lmotcle motcle)) ; cherr = 'CHAINE' 'Keyword ' motcle ' unknown.' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('EGA' motcle 'GEOM') ; TMODE . 'GEOM' = 'TABLE' ; TMODE . 'GEOM' . 'DISC' = discg ; 'FINSI' ; 'SI' ('EGA' motcle 'INCO') ; 'SI' ('EGA' nominc 'GEOM') ; 'ERREUR' 'GEOM nest pas un nom dinconnu acceptable' ; 'FINSI' ; TMODE . nominc = 'TABLE' ; TMODE . nominc . 'DISC' = disinc ; ldd = 'EXISTE' ldiscdd disinc ; 'SI' ('NON' ('EXISTE' ltypinc typinc)) ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('EGA' typinc 'SCAL') ; nbinc = 1 ; 'SINON' ; nbinc = vdim ; 'FINSI' ; TMODE . nominc . 'NOMPRI' = 'TABLE' ; 'REPETER' ibinc nbinc ; 'SI' ldd ; 'ARGUMENT' nomcom*'LISTMOTS' ; 'SINON' ; 'FINSI' ; TMODE . nominc . 'NOMPRI' . &ibinc = nomcom ; 'FIN' ibinc ; TMODE . nominc . 'NOMDUA' = 'TABLE' ; 'REPETER' ibinc nbinc ; 'SI' ldd ; 'ARGUMENT' nomcom*'LISTMOTS' ; 'SINON' ; 'FINSI' ; TMODE . nominc . 'NOMDUA' . &ibinc = nomcom ; 'FIN' ibinc ; 'FINSI' ; 'FIN' imotcle ; * 'RESPRO' tmode ; * * End of procedure file MODENLIN * 'FINPROC' ; *ENDPROCEDUR modenlin *BEGINPROCEDUR grig2 ************************************************************************ * NOM : GRIG2 * DESCRIPTION : * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, ??/??/2007, version initiale * HISTORIQUE : v1, ??/??/2007, 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 ! ************************************************************************ * * 'DEBPROC' GRIG2 ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; * * Lectures * debug = FAUX ; lmotcle = 'MOTS' 'NPRI' 'FPRI' 'CPRI' 'NDUA' 'FDUA' 'CDUA' 'NCOF' 'FCOF' 'CCOF' 'LAPN' 'GMBT' ; * Il faut initialiser valt et valq, sinon on peut capturer ceux de * la procédure appelante valt = 'valt' ; valq = 'valq' ; llapn = 0 ; 'REPETER' imotcle ; 'SI' ('NON' ('EXISTE' motcle)) ; 'QUITTER' imotcle ; 'FINSI' ; 'SI' ('NON' ('EXISTE' lmotcle motcle)) ; cherr = 'CHAINE' 'Keyword ' motcle ' unknown.' ; 'ERREUR' cherr ; 'FINSI' ; tst1 = 'EGA' motcle 'FPRI' ; tst2 = 'EGA' motcle 'FDUA' ; tst = tst1 'OU' tst2 ; 'SI' tst ; 'SI' tst1 ; tt = TDISC . nomt ; 'FINSI' ; 'SI' tst2 ; tt = TDISC . nomq ; 'FINSI' ; 'SI' isvec ; 'ARGUMENT' valv*'LISTREEL' ; 'SINON' ; 'ARGUMENT' valv*'FLOTTANT' ; 'FINSI' ; 'SI' tst1 ; valt = valv ; 'FINSI' ; 'SI' tst2 ; valq = valv ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' motcle 'FCOF') ; 'ARGUMENT' valo*'FLOTTANT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CPRI') ; 'ARGUMENT' valt*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CDUA') ; 'ARGUMENT' valq*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CCOF') ; 'ARGUMENT' valo*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'GMBT') ; llapn = 2 ; 'FINSI' ; 'FIN' imotcle ; * * Tests * discg = TDISC . 'GEOM' . 'DISC' ; 'SI' ('EXISTE' tdisc 'methgau') ; 'SINON' ; methgau = 'GAU7' ; 'FINSI' ; tnomt = TDISC . nomt ; tnomq = TDISC . nomq ; * Scalaire ou vecteur 'SI' ('NEG' ninct nincq) ; cherr = 'CHAINE' 'les primales et duales nont pas le meme nombre de composantes' ; 'ERREUR' cherr ; 'FINSI' ; cherr = 'CHAINE' 'les inconnues doivent etre vectorielles' ; 'ERREUR' cherr ; 'FINSI' ; * ninc = ninct ; * lcof = 'EXISTE' TDISC nomo ; 'SI' lcof ; ncof = 1 ; tcof = TDISC . nomo ; 'SINON' ; ncof = 0 ; 'FINSI' ; * 'SI' debug ; 'SI' lcof ; 'MESSAGE' 'Un coef a ete detecte' ; 'SINON' ; 'MESSAGE' 'pas de coef detecte' ; 'FINSI' ; 'FINSI' ; * idim = 0 ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'PLANDEFO')) ; idim = 2 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ; idim = 2 ; iaxi = VRAI ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 3) ('EGA' vmod 'TRID')) ; idim = 3 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('EGA' vdim 1) ; idim = 1 ; iaxi = FAUX ; 'FINSI' ; * 'MESSAGE' ('CHAINE' 'iaxi=' iaxi ); 'SI' ('EGA' idim 0) ; 'ERREUR' ('CHAINE' 'vmod=' vmod ' et vdim=' vdim ' non prevu') ; 'FINSI' ; 'SI' iaxi ; rmt = 'COORDONNEE' 1 _mt ; deupi = '*' PI 2.D0 ; 'FINSI' ; * * Optimisation possible : construire la matrice par blocs * qd valt et valq ne sont pas donnés * * *Bug ? numop = ('**' ninc 2) '+' 1 ; numop = '**' ninc 2 ; 'SI' iaxi ; numop = '+' numop 1 ; 'FINSI' ; numder = idim ; numvar = ninc ; ncof = '+' ncof 1 ; *delete 'SI' iaxi ; ncof = '+' ncof 1 ; 'FINSI' ; numdat = ncof ; numcof = ncof ; * * 'REPETER' iiinc ninc ; iinc = &iiinc ; A . 'VAR' . iinc . 'NOMDDL' = tnomt . 'NOMPRI' . iinc ; A . 'VAR' . iinc . 'DISC' = tnomt . 'DISC' ; 'SI' lvalt ; 'SI' lvt ; A . 'VAR' . iinc . 'VALEUR' = 'EXTRAIRE' valt iinc ; 'SINON' ; A . 'VAR' . iinc . 'VALEUR' = valt ; 'FINSI' ; 'FINSI' ; 'FIN' iiinc ; * icof = 0 ; icof = '+' icof 1 ; A . 'DAT' . icof . 'DISC' = 'CSTE' ; A . 'DAT' . icof . 'VALEUR' = 2.D0 ; A . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'SI' lcof ; icof = '+' icof 1 ; A . 'DAT' . icof . 'NOMDDL' = tcof . 'NOMPRI' . 1 ; A . 'DAT' . icof . 'DISC' = tcof . 'DISC' ; A . 'DAT' . icof . 'VALEUR' = valo ; A . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'FINSI' ; * iop = 0 ; 'REPETER' iidim idim ; 'REPETER' jidim idim ; iop = '+' iop 1 ; 'SI' ('EGA' &iidim &jidim) ; 'SI' ('EGA' llapn 0) ; A . iop . &iidim . &jidim = ll2 ; 'SINON' ; A . iop . &iidim . &jidim = ll ; 'FINSI' ; 'SINON' ; 'SI' ('NEG' llapn 2) ; A . iop . &iidim . &jidim = ll ; 'FINSI' ; 'SI' ('NEG' llapn 1) ; A . iop . &jidim . &iidim = ll ; 'FINSI' ; 'FINSI' ; 'FIN' jidim ; 'FIN' iidim ; 'SI' iaxi ; iop = '+' iop 1 ; 'SI' ('EGA' llapn 0) ; A . iop . 1 . 0 = ll2 ; 'SINON' ; A . iop . 1 . 0 = ll ; 'FINSI' ; 'FINSI' ; * 'SI' iaxi ; numdat = 2 ; numcof = 2 ; 'SINON' ; numdat = 0 ; numcof = 0 ; 'FINSI' ; * * icof = 0 ; * 'SI' iaxi ; icof = '+' icof 1 ; B . 'DAT' . icof . 'DISC' = discg ; B . 'DAT' . icof . 'VALEUR' = rmt ; B . 'COF' . icof . 'COMPOR' = 'IDEN' ; icof = '+' icof 1 ; B . 'DAT' . icof . 'DISC' = 'CSTE' ; B . 'DAT' . icof . 'VALEUR' = deupi ; B . 'COF' . icof . 'COMPOR' = 'IDEN' ; mic = '*' ('-' icof 1) -1 ; 'FINSI' ; * 'REPETER' iiinc ninc ; iinc = &iiinc ; B . 'VAR' . iinc . 'NOMDDL' = tnomq . 'NOMDUA' . iinc ; B . 'VAR' . iinc . 'DISC' = tnomq . 'DISC' ; 'SI' lvalq ; 'SI' lvq ; B . 'VAR' . iinc . 'VALEUR' = 'EXTRAIRE' valq iinc ; 'SINON' ; B . 'VAR' . iinc . 'VALEUR' = valq ; 'FINSI' ; 'FINSI' ; 'FIN' iiinc ; * iop = 0 ; 'REPETER' iidim idim ; 'REPETER' jidim idim ; iop = '+' iop 1 ; B . iop . &iidim . &jidim = ll ; 'FIN' jidim ; 'FIN' iidim ; 'SI' iaxi ; iop = '+' iop 1 ; B . iop . 1 . 0 = llb ; * B . iop . 1 . 0 = ll ; 'FINSI' ; * mgrig = NLINP discg _mt A B methgau ; * Integration par parties * mgrig = '*' mgrig -1.D0 ; * 'RESPRO' mgrig ; 'FINPROC' ; * * End of procedure file GRIG2 * *ENDPROCEDUR grig2 *BEGINPROCEDUR gdiv2 ************************************************************************ * NOM : GDIV2 * DESCRIPTION : Une matrice de masse * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v2, 14/03/2006, mise à jour NLIN évolué * VERSION : v1, 13/05/2004, version initiale * HISTORIQUE : v1, 13/05/2004, 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 ! ************************************************************************ * * 'DEBPROC' GDIV2 ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' _smt/'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; * * Lectures * debug = FAUX ; lmotcle = 'MOTS' 'NPRI' 'FPRI' 'CPRI' 'NDUA' 'FDUA' 'CDUA' 'NCOF' 'FCOF' 'CCOF' 'GBBT' 'GMBT' ; * Il faut initialiser valt et valq, sinon on peut capturer ceux de * la procédure appelante valt = 'valt' ; valq = 'valq' ; lbbt = 0 ; * 'REPETER' imotcle ; 'SI' ('NON' ('EXISTE' motcle)) ; 'QUITTER' imotcle ; 'FINSI' ; 'SI' ('NON' ('EXISTE' lmotcle motcle)) ; cherr = 'CHAINE' 'Keyword ' motcle ' unknown.' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('EGA' motcle 'FPRI') ; 'ARGUMENT' valt*'LISTREEL' ; 'FINSI' ; 'SI' ('EGA' motcle 'FDUA') ; 'ARGUMENT' valq*'FLOTTANT' ; 'FINSI' ; 'SI' ('EGA' motcle 'FCOF') ; 'ARGUMENT' valo*'FLOTTANT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CPRI') ; 'ARGUMENT' valt*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CDUA') ; 'ARGUMENT' valq*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CCOF') ; 'ARGUMENT' valo*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'GBBT') ; lbbt = 1 ; 'FINSI' ; 'SI' ('EGA' motcle 'GMBT') ; lbbt = 2 ; 'FINSI' ; 'FIN' imotcle ; * * Tests * discg = TDISC . 'GEOM' . 'DISC' ; 'SI' ('EXISTE' tdisc 'methgau') ; 'SINON' ; methgau = 'GAU7' ; 'FINSI' ; tnomt = TDISC . nomt ; tnomq = TDISC . nomq ; * lcof = 'EXISTE' TDISC nomo ; 'SI' lcof ; ncof = 1 ; tcof = TDISC . nomo ; 'SINON' ; ncof = 0 ; 'FINSI' ; * 'SI' debug ; 'SI' lcof ; 'MESSAGE' 'Un coef a ete detecte' ; 'SINON' ; 'MESSAGE' 'pas de coef detecte' ; 'FINSI' ; 'FINSI' ; * idim = 0 ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'PLANDEFO')) ; idim = 2 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ; idim = 2 ; iaxi = VRAI ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 3) ('EGA' vmod 'TRID')) ; idim = 3 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('EGA' vdim 1) ; idim = 1 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('EGA' idim 0) ; 'ERREUR' ('CHAINE' 'vmod=' vmod ' et vdim=' vdim ' non prevu') ; 'FINSI' ; 'SI' iaxi ; dp = ('*' PI 2.D0) ; rmt = 'COORDONNEE' 1 _mt ; ncof = ncof '+' 2 ; 'FINSI' ; * Scalaire ou vecteur 'SI' ('NEG' ninct idim) ; cherr = 'CHAINE' 'la primale doit etre un vecteur' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('NEG' nincq 1) ; cherr = 'CHAINE' 'la duale doit etre un scalaire' ; 'ERREUR' cherr ; 'FINSI' ; * numop = 1 ; numder = idim ; numvar = ninct ; numdat = ncof ; numcof = ncof ; * 'REPETER' iiinct ninct ; iinct = &iiinct ; A . 'VAR' . iinct . 'NOMDDL' = tnomt . 'NOMPRI' . iinct ; A . 'VAR' . iinct . 'DISC' = tnomt . 'DISC' ; 'SI' lvalt ; 'SI' lvt ; A . 'VAR' . iinct . 'VALEUR' = 'EXTRAIRE' valt iinct ; 'SINON' ; A . 'VAR' . iinct . 'VALEUR' = valt ; 'FINSI' ; 'FINSI' ; 'FIN' iiinct ; * icof = 0 ; 'SI' lcof ; icof = '+' icof 1 ; A . 'DAT' . icof . 'NOMDDL' = tcof . 'NOMPRI' . 1 ; A . 'DAT' . icof . 'DISC' = tcof . 'DISC' ; A . 'DAT' . icof . 'VALEUR' = valo ; A . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'SINON' ; 'FINSI' ; * 'SI' iaxi ; icof = '+' icof 1 ; A . 'DAT' . icof . 'DISC' = 'CSTE' ; A . 'DAT' . icof . 'VALEUR' = dp ; A . 'COF' . icof . 'COMPOR' = 'IDEN' ; icof = '+' icof 1 ; A . 'DAT' . icof . 'DISC' = discg ; A . 'DAT' . icof . 'VALEUR' = rmt ; A . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'FINSI' ; * 'SI' iaxi ; 'REPETER' iidim idim ; A . 1 . &iidim . &iidim = lldpr ; 'FIN' iidim ; A . 1 . 1 . 0 = lldp ; 'SINON' ; 'REPETER' iidim idim ; A . 1 . &iidim . &iidim = ll ; 'FIN' iidim ; 'FINSI' ; * numvar = 1 ; numdat = 0 ; numcof = 0 ; * B . 'VAR' . 1 . 'NOMDDL' = tnomq . 'NOMDUA' . 1 ; B . 'VAR' . 1 . 'DISC' = tnomq . 'DISC' ; 'SI' lvalq ; B . 'VAR' . 1 . 'VALEUR' = valq ; 'FINSI' ; * 'SI' ('OU' ('EGA' lbbt 0) ('EGA' lbbt 1)) ; 'SI' ('EXISTE' _smt) ; 'SINON' ; mgdiv2 = NLINP discg _mt A B methgau ; 'FINSI' ; 'FINSI' ; 'SI' ('OU' ('EGA' lbbt 1) ('EGA' lbbt 2)) ; B . 'VAR' . 1 . 'NOMDDL' = tnomq . 'NOMPRI' . 1 ; 'REPETER' iiinct ninct ; iinct = &iiinct ; A . 'VAR' . iinct . 'NOMDDL' = tnomt . 'NOMDUA' . iinct ; 'FIN' iiinct ; 'SI' ('EXISTE' _smt) ; 'SINON' ; mgdiv3 = NLINP discg _mt B A methgau ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' lbbt 0) ; mgdiv = mgdiv2 ; 'FINSI' ; 'SI' ('EGA' lbbt 1) ; mgdiv = mgdiv2 'ET' mgdiv3 ; 'FINSI' ; 'SI' ('EGA' lbbt 2) ; mgdiv = mgdiv3 ; 'FINSI' ; 'RESPRO' mgdiv ; 'FINPROC' ; * * End of procedure file GDIV2 * *ENDPROCEDUR gdiv2 *BEGINPROCEDUR gnor2 ************************************************************************ * NOM : GNOR2 * DESCRIPTION : Calcule le champ de normales à une surface. * Peut servir à calculer une pression, un potentiel * lié à la gravité, un volume contenu dans une surface. * Attention à l'orientation de la surface ! * * Computes a field of normal to a surface. * Also useful to compute a pressure field, * a gravity potential field, a volume enclosed * by a surface. * WARNING : The orientation of the surface matters ! * * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011 * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' GNOR2 ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; * * Lectures * debug = FAUX ; lmotcle = 'MOTS' 'NPRI' 'FPRI' 'CPRI' 'NDUA' 'FDUA' 'CDUA' 'NCOF' 'FCOF' 'CCOF' ; * Il faut initialiser valt et valq, sinon on peut capturer ceux de * la procédure appelante valt = 'valt' ; valq = 'valq' ; 'REPETER' imotcle ; 'SI' ('NON' ('EXISTE' motcle)) ; 'QUITTER' imotcle ; 'FINSI' ; 'SI' ('NON' ('EXISTE' lmotcle motcle)) ; cherr = 'CHAINE' 'Keyword ' motcle ' unknown.' ; 'ERREUR' cherr ; 'FINSI' ; tst1 = 'EGA' motcle 'FPRI' ; tst2 = 'EGA' motcle 'FDUA' ; tst3 = 'EGA' motcle 'FCOF' ; tst = tst1 'OU' tst2 'OU' tst3 ; 'SI' tst ; 'SI' tst1 ; tt = TDISC . nomt ; 'FINSI' ; 'SI' tst2 ; tt = TDISC . nomq ; 'FINSI' ; 'SI' tst3 ; tt = TDISC . nomo ; 'FINSI' ; 'SI' isvec ; 'ARGUMENT' valv*'LISTREEL' ; 'SINON' ; 'ARGUMENT' valv*'FLOTTANT' ; 'FINSI' ; 'SI' tst1 ; valt = valv ; 'FINSI' ; 'SI' tst2 ; valq = valv ; 'FINSI' ; 'SI' tst3 ; valo = valv ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' motcle 'CPRI') ; 'ARGUMENT' valt*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CDUA') ; 'ARGUMENT' valq*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CCOF') ; 'ARGUMENT' valo*'CHPOINT' ; 'FINSI' ; 'FIN' imotcle ; * * Tests * discg = TDISC . 'GEOM' . 'DISC' ; 'SI' ('EXISTE' tdisc 'methgau') ; 'SINON' ; methgau = 'GAU7' ; 'FINSI' ; tnomt = TDISC . nomt ; tnomq = TDISC . nomq ; * Scalaire ou vecteur 'SI' ('ET' ('NEG' ninct 1) ('NEG' ninct dim)) ; cherr = 'CHAINE' 'la primale doit etre un scalaire ou un vecteur' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('NEG' nincq dim) ; cherr = 'CHAINE' 'la duale doit etre un vecteur' ; 'ERREUR' cherr ; 'FINSI' ; *ninc = ninct ; * lcof = 'EXISTE' TDISC nomo ; 'SI' lcof ; tcof = TDISC . nomo ; 'SINON' ; ncof = 0 ; 'FINSI' ; * 'SI' debug ; 'SI' lcof ; 'MESSAGE' 'Un coef a ete detecte' ; 'SINON' ; 'MESSAGE' 'pas de coef detecte' ; 'FINSI' ; 'FINSI' ; * idim = 0 ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'PLANDEFO')) ; idim = 2 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ; idim = 2 ; iaxi = VRAI ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 3) ('EGA' vmod 'TRID')) ; idim = 3 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('EGA' vdim 1) ; idim = 1 ; iaxi = FAUX ; 'FINSI' ; * 'MESSAGE' ('CHAINE' 'iaxi=' iaxi ); 'SI' ('EGA' idim 0) ; 'ERREUR' ('CHAINE' 'vmod=' vmod ' et vdim=' vdim ' non prevu') ; 'FINSI' ; 'SI' iaxi ; dprmt = '*' ('COORDONNEE' 1 _mt) ('*' PI 2.D0) ; 'FINSI' ; * * Optimisation possible : construire la matrice par blocs * qd valt et valq ne sont pas donnés * numop = nincq ; numder = idim ; numvar = ninct ; numdat = ncof ; numcof = ncof ; 'SI' lcof ; 'REPETER' iicof ncof ; icof = &iicof ; A . 'DAT' . icof . 'NOMDDL' = tcof . 'NOMPRI' . icof ; A . 'DAT' . icof . 'DISC' = tcof . 'DISC' ; 'SI' lvo ; A . 'DAT' . icof . 'VALEUR' = 'EXTRAIRE' valo icof ; 'SINON' ; A . 'DAT' . icof . 'VALEUR' = valo ; 'FINSI' ; A . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'FIN' iicof ; 'SINON' ; 'FINSI' ; 'REPETER' iiincq nincq ; iincq = &iiincq ; A . 'VAR' . iinct . 'NOMDDL' = tnomt . 'NOMPRI' . iinct ; A . 'VAR' . iinct . 'DISC' = tnomt . 'DISC' ; 'SI' lvalt ; 'SI' lvt ; A . 'VAR' . iinct . 'VALEUR' = 'EXTRAIRE' valt iinct ; 'SINON' ; A . 'VAR' . iinct . 'VALEUR' = valt ; 'FINSI' ; 'FINSI' ; 'SI' lcof ; 'SINON' ; A . iincq . iinct . 0 = ll ; 'FINSI' ; 'FIN' iiincq ; * 'SI' iaxi ; numdat = 1 ; numcof = dim '+' 1 ; 'SINON' ; numdat = 0 ; numcof = dim ; 'FINSI' ; numvar = nincq ; icof = 0 ; 'REPETER' iiidim idim ; icof = '+' icof 1 ; B . 'COF' . icof . 'COMPOR' = 'CHAINE' 'VNOR' &iiidim ; 'FIN' iiidim ; * 'SI' iaxi ; icof = '+' icof 1 ; B . 'DAT' . 1 . 'DISC' = discg ; B . 'DAT' . 1 . 'VALEUR' = dprmt ; B . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'SINON' ; 'FINSI' ; 'REPETER' iiincq nincq ; iincq = &iiincq ; B . 'VAR' . iincq . 'NOMDDL' = tnomq . 'NOMDUA' . iincq ; B . 'VAR' . iincq . 'DISC' = tnomq . 'DISC' ; 'SI' lvalq ; 'SI' lvq ; B . 'VAR' . iincq . 'VALEUR' = 'EXTRAIRE' valq iincq ; 'SINON' ; B . 'VAR' . iincq . 'VALEUR' = valq ; 'FINSI' ; 'FINSI' ; 'FIN' iiincq ; * * 'RESPRO' mgnor2 ; 'FINPROC' ; * * End of procedure file GNOR2 * *ENDPROCEDUR gnor2 *BEGINPROCEDUR gmass2 ************************************************************************ * NOM : GMASS2 * DESCRIPTION : Une matrice de masse * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v2, 14/03/2006, mise à jour NLIN évolué * VERSION : v1, 13/05/2004, version initiale * HISTORIQUE : v1, 13/05/2004, 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 ! ************************************************************************ * * 'DEBPROC' GMASS2 ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' _smt/'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; * * Lectures * debug = FAUX ; lmotcle = 'MOTS' 'NPRI' 'FPRI' 'CPRI' 'NDUA' 'FDUA' 'CDUA' 'NCOF' 'FCOF' 'CCOF' ; * Il faut initialiser valt et valq, sinon on peut capturer ceux de * la procédure appelante valt = 'valt' ; valq = 'valq' ; 'REPETER' imotcle ; 'SI' ('NON' ('EXISTE' motcle)) ; 'QUITTER' imotcle ; 'FINSI' ; 'SI' ('NON' ('EXISTE' lmotcle motcle)) ; cherr = 'CHAINE' 'Keyword ' motcle ' unknown.' ; 'ERREUR' cherr ; 'FINSI' ; tst1 = 'EGA' motcle 'FPRI' ; tst2 = 'EGA' motcle 'FDUA' ; tst = tst1 'OU' tst2 ; 'SI' tst ; 'SI' tst1 ; tt = TDISC . nomt ; 'FINSI' ; 'SI' tst2 ; tt = TDISC . nomq ; 'FINSI' ; 'SI' isvec ; 'ARGUMENT' valv*'LISTREEL' ; 'SINON' ; 'ARGUMENT' valv*'FLOTTANT' ; 'FINSI' ; 'SI' tst1 ; valt = valv ; 'FINSI' ; 'SI' tst2 ; valq = valv ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' motcle 'FCOF') ; 'ARGUMENT' valo*'FLOTTANT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CPRI') ; 'ARGUMENT' valt*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CDUA') ; 'ARGUMENT' valq*'CHPOINT' ; 'FINSI' ; 'SI' ('EGA' motcle 'CCOF') ; 'ARGUMENT' valo*'CHPOINT' ; 'FINSI' ; 'FIN' imotcle ; * * Tests * discg = TDISC . 'GEOM' . 'DISC' ; 'SI' ('EXISTE' tdisc 'methgau') ; 'SINON' ; methgau = 'GAU7' ; 'FINSI' ; tnomt = TDISC . nomt ; tnomq = TDISC . nomq ; * Scalaire ou vecteur 'SI' ('NEG' ninct nincq) ; cherr = 'CHAINE' 'les primales et duales nont pas le meme nombre de composantes' ; 'ERREUR' cherr ; 'FINSI' ; ninc = ninct ; * lcof = 'EXISTE' TDISC nomo ; 'SI' lcof ; ncof = 1 ; tcof = TDISC . nomo ; 'SINON' ; ncof = 0 ; 'FINSI' ; * 'SI' debug ; 'SI' lcof ; 'MESSAGE' 'Un coef a ete detecte' ; 'SINON' ; 'MESSAGE' 'pas de coef detecte' ; 'FINSI' ; 'FINSI' ; * idim = 0 ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'PLANDEFO')) ; idim = 2 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ; idim = 2 ; iaxi = VRAI ; 'FINSI' ; 'SI' ('ET' ('EGA' vdim 3) ('EGA' vmod 'TRID')) ; idim = 3 ; iaxi = FAUX ; 'FINSI' ; 'SI' ('EGA' vdim 1) ; idim = 1 ; iaxi = FAUX ; 'FINSI' ; * 'MESSAGE' ('CHAINE' 'iaxi=' iaxi ); 'SI' ('EGA' idim 0) ; 'ERREUR' ('CHAINE' 'vmod=' vmod ' et vdim=' vdim ' non prevu') ; 'FINSI' ; 'SI' iaxi ; dprmt = '*' ('COORDONNEE' 1 _mt) ('*' PI 2.D0) ; 'FINSI' ; * * Optimisation possible : construire la matrice par blocs * qd valt et valq ne sont pas donnés * numop = ninc ; numder = idim ; numvar = ninc ; numdat = ncof ; numcof = ncof ; 'SI' lcof ; A . 'DAT' . 1 . 'NOMDDL' = tcof . 'NOMPRI' . 1 ; A . 'DAT' . 1 . 'DISC' = tcof . 'DISC' ; A . 'DAT' . 1 . 'VALEUR' = valo ; A . 'COF' . 1 . 'COMPOR' = 'IDEN' ; 'SINON' ; 'FINSI' ; 'REPETER' iiinc ninc ; iinc = &iiinc ; A . 'VAR' . iinc . 'NOMDDL' = tnomt . 'NOMPRI' . iinc ; A . 'VAR' . iinc . 'DISC' = tnomt . 'DISC' ; 'SI' lvalt ; 'SI' lvt ; A . 'VAR' . iinc . 'VALEUR' = 'EXTRAIRE' valt iinc ; 'SINON' ; A . 'VAR' . iinc . 'VALEUR' = valt ; 'FINSI' ; 'FINSI' ; A . iinc . iinc . 0 = ll ; 'FIN' iiinc ; * 'SI' iaxi ; numdat = 1 ; numcof = 1 ; 'SINON' ; numdat = 0 ; numcof = 0 ; 'FINSI' ; 'SI' iaxi ; B . 'DAT' . 1 . 'DISC' = discg ; B . 'DAT' . 1 . 'VALEUR' = dprmt ; B . 'COF' . 1 . 'COMPOR' = 'IDEN' ; 'SINON' ; 'FINSI' ; 'REPETER' iiinc ninc ; iinc = &iiinc ; B . 'VAR' . iinc . 'NOMDDL' = tnomq . 'NOMDUA' . iinc ; B . 'VAR' . iinc . 'DISC' = tnomq . 'DISC' ; 'SI' lvalq ; 'SI' lvq ; B . 'VAR' . iinc . 'VALEUR' = 'EXTRAIRE' valq iinc ; 'SINON' ; B . 'VAR' . iinc . 'VALEUR' = valq ; 'FINSI' ; 'FINSI' ; B . iinc . iinc . 0 = ll ; 'FIN' iiinc ; * 'SI' ('EXISTE' _smt) ; 'SINON' ; mgmass2 = NLINP discg _mt A B methgau ; 'FINSI' ; * 'RESPRO' mgmass2 ; 'FINPROC' ; * * End of procedure file GMASS2 * *ENDPROCEDUR gmass2 * * ************************************************************************* * * * MAIN : 1) MESH * 2) COMPUTATIONAL LOOP * 3) TESTs * ************************************************************************ * * * Maillage et modèle * *nx = 1 ; ny =1 ; *nx = 1 ; ny =2 ; nx = 10 ; ny= 10 ; pA = 0. 0. ; pB = 1. 0. ; pC = 1. 1. ; pD = 0. 1. ; ang = 32.1 ; pA pB pC pD = 'TOURNER' pA pB pC pD ang pA ; discu = 'QUAF' ; discp = 'LINE' ; tol = 1.D-6 ; bas = 'DROIT' nx pA pB ; dro = 'DROIT' ny pB pC ; hau = 'DROIT' nx pC pD ; gau = 'DROIT' ny pD pA ; mt = 'DALLER' bas dro hau gau ; * tmail = QUAFME mt 'mt' tol ; tmail = QUAFME tmail bas 'bas' dro 'dro' hau 'hau' gau 'gau' tol ; _mt = tmail . 'mt' . 'QUAF' ; mt = tmail . 'mt' . discu ; mtp = tmail . 'mt' . discp ; cmt = 'CONTOUR' mt ; bas = tmail . 'bas' . discu ; dro = tmail . 'dro' . discu ; hau = tmail . 'hau' . discu ; gau = tmail . 'gau' . discu ; _bas = tmail . 'bas' . 'QUAF' ; _dro = tmail . 'dro' . 'QUAF' ; _hau = tmail . 'hau' . 'QUAF' ; _gau = tmail . 'gau' . 'QUAF' ; * tmode = MODENLIN 'GEOM' 'LINE' 'INCO' 'UN' discu 'VECT' 'UX' 'UY' 'FX' 'FY' 'INCO' 'PN' discp 'SCAL' 'LXP' 'LXP' ; nomvp = 'ET' (tmode . 'UN' .'NOMPRI' . 1) (tmode . 'UN' .'NOMPRI' . 2) ; nomvd = 'ET' (tmode . 'UN' .'NOMDUA' . 1) (tmode . 'UN' .'NOMDUA' . 2) ; discg = tmode . 'GEOM' . 'DISC' ; * * Matrice de rigidité * *rig = GRIG2 _mt tmode 'NPRI' 'UN' 'NDUA' 'UN' 'LAPN' ; rig = GRIG2 _mt tmode 'NPRI' 'UN' 'NDUA' 'UN' ; * * Matrice de la contrainte de divergence nulle et sa transposée * cnt1 = GDIV2 _mt tmode 'NPRI' 'UN' 'NDUA' 'PN' ; cnt2 = GDIV2 _mt tmode 'NPRI' 'UN' 'NDUA' 'PN' 'GMBT' ; mcnt = cnt1 'ET' cnt2 ; * * Conditions aux limites * * On relache la contrainte sur la vitesse normale en 1 point (pmil) pour * fixer le mode de pression constante (pmil 'ET' pC 'ET' pD) ; ('ET' pA pD) ; ('ET' pB pC) ; xbas ybas = 'COORDONNEE' bas ; sbas = '**' ('+' ('**' xbas 2.) ('**' ybas 2)) 0.5 ; sbas = '**' ('SIN' ('*' sbas 180.)) 2. ; ssbas = 'SIN' ('*' 90. sbas) ; xab = 'COORDONNEE' 1 vAB ; yab = 'COORDONNEE' 2 vAB ; * * * Construction de la normale * vnorh = GNOR2 _hau tmode 'NPRI' discg 'FPRI' 1. 'NDUA' 'UN' ; vnorg = GNOR2 _gau tmode 'NPRI' discg 'FPRI' 1. 'NDUA' 'UN' ; vnord = GNOR2 _dro tmode 'NPRI' discg 'FPRI' 1. 'NDUA' 'UN' ; * bltot = mblh 'ET' mblg 'ET' mbld 'ET' mblb 'ET' mblp ; fbltot = 'DEPIMPOSE' mblb ssbas ; * * Matrice et second membre totaux * Résolution * mtot = rig 'ET' mcnt 'ET' bltot ; *mtot = rig 'ET' bltot ; ftot = fbltot ; *'LISTE' ('EXTRAIRE' mtot 'COMP') ; *'LISTE' ('EXTRAIRE' mtot 'COMP' 'DUAL') ; *'LISTE' ('EXTRAIRE' ftot 'COMP') ; * opti impi 1 ; lpass = VRAI ; * On recopie la matrice car enchaîner les deux options peut poser * problème mtot1 = mtot '*' 1. ; mtot2 = mtot '*' 1. ; 'SI' graph ; 'TRACER' vvit cmt 'TITR' 'Vitesses' ; 'FINSI' ; * * Comme l'élimination des dépendances est un préconditionnement, * on peut vérifier qu'il marche * errv = 1.D-14 ; err1 = 'MAXIMUM' ('-' sol1 sol3 'ABS') ; err2 = 'MAXIMUM' ('-' sol2 sol4 'ABS') ; tst1 = '<' err1 errv ; tst2 = '<' err2 errv ; tst = tst1 'ET' tst2 ; 'MESSAGE' ('CHAINE' 'Test 1 sur la reproductibilité de lelimination') ; 'MESSAGE' ' err1 = ' err1 ' tol=' errv ; 'MESSAGE' ' err2 = ' err2 ' tol=' errv ; 'SI' tst ; 'MESSAGE' 'Test 1 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 1 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; * * Vérification de CONDENSE et EVAPORE * mtotb = '*' mtot 1.D0 ; * On enlève ce test pour ne pas modifier mtot * mtotc ftotc ftot1 = 'KOPS' 'CONDENSE' mtot ftot ; * solc1 = 'KRES' mtotc ftotc 'LDEPE' FAUX 'IMPR' 2 ; * * Vérification de la résolution du système réduit (cf. fiche ano 8186) * sol5 = 'KOPS' 'EVAPORE' solc1 mtot ftot ftot1 ; err0 = '/' ('MAXIMUM' ('-' ftotc ('*' mtotc solc2)) 'ABS') ('MAXIMUM' ftotc 'ABS') ; errv = 1.D-14 ; * err1 = 'MAXIMUM' ('-' sol2 sol5 'ABS') ; err2 = 'MAXIMUM' ('-' sol2 sol6 'ABS') ; tst0 = '<' err0 errv ; * tst1 = '<' err1 errv ; tst2 = '<' err2 errv ; * tst = tst0 'ET' tst1 'ET' tst2 ; tst = tst0 'ET' tst2 ; 'MESSAGE' ('CHAINE' 'Test 2 sur CONDENSE et EVAPORE') ; 'MESSAGE' ' err0 = ' err0 ' tol=' errv ; * 'MESSAGE' ' err1 = ' err1 ' tol=' errv ; 'MESSAGE' ' err2 = ' err2 ' tol=' errv ; 'SI' tst ; 'MESSAGE' 'Test 2 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 2 not passed ' ; 'FINSI' ; *'OPTI' 'DONN' 5 ; lpass = lpass 'ET' tst ; * * On vérifie que l'élimination des conditions aux limites sur * la vitesse s'est bien faite. * Les résultats avec et sans élimination des conditions aux limites ne * sont pas si proches car la matrice Vitesse-Pression est mal * conditionnée (l'erreur est plus élevée en pression) * errv = 1.D-13 ; errp = 1.D-11 ; errlx = 4.D-13 ; err1 = 'MAXIMUM' ('-' sol1 sol2) 'ABS' 'AVEC' nomvp ; err2 = 'MAXIMUM' ('-' sol1 sol2) 'ABS' 'AVEC' nompp ; err3 = 'MAXIMUM' ('-' sol1 sol2) 'ABS' 'SANS' ('ET' nomvp nompp) ; tst1 = '<' err1 errv ; tst2 = '<' err2 errp ; tst3 = '<' err3 errlx ; tst = tst1 'ET' tst2 'ET' tst3 ; 'MESSAGE' ('CHAINE' 'Test 3 sur la solution avec OU sans elimination' ' des conditions aux limites') ; 'MESSAGE' ' err UX = ' err1 ' tol=' errv ; 'MESSAGE' ' err P = ' err2 ' tol=' errp ; 'MESSAGE' ' err LX = ' err3 ' tol=' errlx ; 'SI' tst ; 'MESSAGE' 'Test 3 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 3 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; * * * On essaie le raffinement itératif pour rapprocher * les solutions avec et sans élimination * On choisit nit=1 car sinon on dégrade à nouveau la précision * nit = 1 ; sol7 = sol1 ; 'REPETER' it nit ; smb = '-' ftot ('*' mtot sol7) ; sol7 = '+' sol7 dsol ; 'FIN' it ; sol8 = sol2 ; 'REPETER' it nit ; smb = '-' ftot ('*' mtot sol8) ; sol8 = '+' sol8 dsol ; 'FIN' it ; errv = 2.D-14 ; errp = 2.D-12 ; errlx = 8.D-14 ; err1 = 'MAXIMUM' ('-' sol7 sol8) 'ABS' 'AVEC' nomvp ; err2 = 'MAXIMUM' ('-' sol7 sol8) 'ABS' 'AVEC' nompp ; err3 = 'MAXIMUM' ('-' sol7 sol8) 'ABS' 'SANS' ('ET' nomvp nompp) ; tst1 = '<' err1 errv ; tst2 = '<' err2 errp ; tst3 = '<' err3 errlx ; tst = tst1 'ET' tst2 'ET' tst3 ; 'MESSAGE' ('CHAINE' 'Test 4 sur la solution avec OU sans elimination' ' 'ET' raffinement iteratif') ; 'MESSAGE' ' err UX = ' err1 ' tol=' errv ; 'MESSAGE' ' err P = ' err2 ' tol=' errp ; 'MESSAGE' ' err LX = ' err3 ' tol=' errlx ; 'SI' tst ; 'MESSAGE' 'Test 4 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 4 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; * On choisit ensuite sol8 comme solution de référence solref = sol8 ; * * Méthode de lagrangien augmenté itérée * * Eliminons d'abord le plus de contraintes possible mtotd = '*' mtot 1. ; * On vérifie que les 'FLX' ont disparus dans la matrice condensée et de * la force (en fait elle existe toujours dans la force) * MAJ: suite à la fiche ano 8186, on peut rétablir le test tst1 = 'NON' ('EXISTE' lp1 'FLX') ; tst2 = 'NON' ('EXISTE' lp2 'FLX') ; tst = tst1 'ET' tst2 ; *tst = tst1 ; 'MESSAGE' ('CHAINE' 'Test 5 sur condensation des LX et FLX') ; 'MESSAGE' ('CHAINE' 'lp1=') ; 'LISTE' lp1 ; 'MESSAGE' ('CHAINE' 'lp2=') ; 'LISTE' lp2 ; 'MESSAGE' ('CHAINE' ' tst1 = ' tst1) ; 'MESSAGE' ('CHAINE' ' tst2 = ' tst2) ; 'SI' tst ; 'MESSAGE' 'Test 5 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 5 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; * Ensuite extraction rigidité et contraintes krig = 'EXTRAIRE' mtotc nomvp nomvd ; * Matrice masse (+ diagonalisé pour la pression) kmasp = GMASS2 _mt tmode 'NPRI' 'PN' 'NDUA' 'PN' ; kmaspd = GMASS2 _mt tmode 'NPRI' 'PN' 'FPRI' 1.D0 'NDUA' 'PN' ; mas = 'MAXIMUM' ('RESULT' kmaspd) ; masd = 'MAXIMUM' ('RESULT' dkmasp) ; 'MESSAGE' ('CHAINE' 'mas=' mas) ; 'MESSAGE' ('CHAINE' 'masd=' masd) ; * Cela ne paraît pas forcément utile *dkmass = '*' dkmasp ('/' mas masd) ; dkmass = dkmasp ; dkmassi = 'INVERSE' dkmass ; * * Matrice de pénalisation * * Scaling dsca = '/' drig dlagd nomvp nomvp nomvp ; * Petite vérif de la division nouvellement créée drrig = '*' dsca dlagd nomvp nomvp nomvp ; errv = 1.D-14 ; err1 = 'MAXIMUM' ('-' drrig drig 'ABS') ; tst1 = '<' err1 errv ; tst = tst1 ; 'MESSAGE' ('CHAINE' 'Test 6 sur /') ; 'MESSAGE' ' err1 = ' err1 ; 'SI' tst ; 'MESSAGE' 'Test 6 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 6 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; *'OPTI' 'ECHO' 1 ; *'LISTE' ('MAXIMUM' dsca) ; *'LISTE' ('MINIMUM' dsca) ; *'OPTION' 'DONN' 5 ; * Matrice de pénalisation scalée : on scale kcnt **mdsca = 'MANUEL' 'RIGI' ('**' dsca 0.5) ; **kcnts = 'KOPS' 'CMCT' kcnt mdsca ; **kcnt2s = 'KOPS' 'TRANSPOS' kcnts ; *mlagds = '*' mlagd ('MINIMUM' dsca) ; *dlagds = 'EXTRAIRE' mlagds 'DIAG' ; *dscas = '/' drig dlagds nomvp nomvp nomvp ; *'LISTE' ('MAXIMUM' dscas) ; *'LISTE' ('MINIMUM' dscas) ; * 'REPETER' iicas ncas ; icas = &iicas ; alphadd = 'EXTRAIRE' lalphad icas ; alphad = '*' alphadd ('MINIMUM' dsca) ; mlagds = '*' mlagd alphad ; * Directe * nit = 2 ; sol9c = '*' solc 0. ; ftot9c = ftotc ; mtot9c = mtotc ; maug = krig 'ET' mlagds ; 'REPETER' it nit ; smb = '-' ftot9c ('*' mtot9c sol9c) ; smbf2 = '*' ('*' ('*' dkmassi smbg nompp nompd nompp) kcnt2) alphad ; smbaug = '+' smbf smbf2 ; dsolu tt = 'KRES' maug smbaug 'LDEPE' FAUX 'LTIME' VRAI 'IMPR' 1 'TYPINV' 1 ; * 'LISTE' tt ; dsolp = '*' ('*' dkmassi ('-' ('*' kcnt dsolu) smbg) nompp nompd nompp) ('*' alphad +1.) ; dsol = dsolu '+' dsolp ; sol9c = sol9c '+' dsol ; 'FIN' it ; errv = 'EXTRAIRE' lerrv icas ; errp = 'EXTRAIRE' lerrp icas ; errlx = 'EXTRAIRE' lerrlx icas ; 'SI' graph ; tit = 'CHAINE' 'Vitesses' ' jaun=direct' ' roug=lagrangien alpha=' alphadd ; 'FINSI' ; err1 = 'MAXIMUM' ('-' sol8 sol9) 'ABS' 'AVEC' nomvp ; err2 = 'MAXIMUM' ('-' sol8 sol9) 'ABS' 'AVEC' nompp ; err3 = 'MAXIMUM' ('-' sol8 sol9) 'ABS' 'SANS' ('ET' nomvp nompp) ; tst1 = '<' err1 errv ; tst2 = '<' err2 errp ; tst3 = '<' err3 errlx ; tst = tst1 'ET' tst2 'ET' tst3 ; 'MESSAGE' ('CHAINE' 'Test 7 Lagrangien augmenté' ' ' nit ' iterations' ' alpha=' alphadd) ; 'MESSAGE' ('CHAINE' ' err UX = ' err1 ' tol=' errv ) ; 'MESSAGE' ('CHAINE' ' err P = ' err2 ' tol=' errp ) ; 'MESSAGE' ('CHAINE' ' err LX = ' err3 ' tol=' errlx) ; 'SI' tst ; 'MESSAGE' 'Test 7 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 7 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; 'FIN' iicas ; * 'SAUTER' 2 'LIGNE' ; 'SI' lpass ; 'MESSAGE' 'Tout sest bien passe' ; 'SINON' ; 'MESSAGE' 'Il y a eu des erreurs' ; 'FINSI' ; 'SAUTER' 2 'LIGNE' ; 'SI' ('NON' lpass) ; 'ERREUR' 5 ; 'FINSI' ; ************************************************************************ * * END OF TEST PART * ************************************************************************ 'FINSI' ; 'SI' interact ; 'OPTION' 'DONN' 5 'ECHO' 1 ; 'FINSI' ; * 'FIN' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales