* fichier : drop.dgibi ************************************************************************ ************************************************************************ * * 'SAUTER' 2 'LIGNE' ; 'MESSAGE' ' Execution de drop.dgibi' ; 'SAUTER' 2 'LIGNE' ; * graph = faux ; complet = faux ; interact = faux ; lmatrik = faux ; ************************************************************************ * NOM : DROP * DESCRIPTION : Une goutte plane ou axi soumise à la gravité et à * la tension de surface. * Contraintes : on fixe le Delta P ou le Volume * on fixe la position des points ou l'angle * (cf. table tclim) * * A plane or axisymmetric drop subject to surface tension * and gravity and to the following constraints or forces * 1) Constant volume or constant pressure difference * between the interior and exterior * 2) On the triple line: given contact angle or given * position * (see tclim TABLE) * * Reference solution : * -> No gravity : the drop is spherical => analytical solution * -> upward gravity : *@Article{sumesh, * author = {P.T. Sumesh and Rama Govindrajan}, * title = {The possible equilibrium shapes of static pendant drops}, * journal = {The Journal of Chemical Physics}, * year = {2010}, * key = {144707}, * volume = {133}, * pages = {1--8}, *} * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : stephane.gounand@cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * ************************************************************************ * * * PROCEDURES * * ************************************************************************ *BEGINPROCEDUR affvar ************************************************************************ * NOM : AFFVAR * DESCRIPTION : Affiche des variables * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * * 'DEBPROC' AFFVAR ; 'REPETER' bcl ; 'ARGUMENT' x/'FLOTTANT' ; 'SI' ('EXISTE' x) ; 'MESSAGE' ('CHAINE' lx '=' x) ; 'SINON' ; 'QUITTER' bcl ; 'FINSI' ; 'FIN' bcl ; 'FINPROC' ; * * End of procedure file AFFVAR * *ENDPROCEDUR affvar *BEGINPROCEDUR append ************************************************************************ * NOM : APPEND * DESCRIPTION : Rajoute : * - un entier à un listentier * - un réel à un listreel * - un objet (liste, evolution, matrice ou chpoint) * à un indice de table ('MOT' ou 'ENTIER') * * si l'indice n'existe pas * * 'ET' si l'indice existe * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 10/09/2004, version initiale * HISTORIQUE : v1, 10/09/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' APPEND ; 'ARGUMENT' tab/'TABLE' ; 'SI' ('EXISTE' tab) ; 'SI' ('NON' ('EXISTE' itab)) ; 'ARGUMENT' itab*'ENTIER' ; 'FINSI' ; lobj = FAUX ; 'SI' ('NON' lobj) ; 'ARGUMENT' lr/'LISTREEL' ; 'SI' ('EXISTE' lr) ; obj = lr ; lobj = VRAI ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; 'ARGUMENT' le/'LISTENTI' ; 'SI' ('EXISTE' le) ; obj = le ; lobj = VRAI ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; 'ARGUMENT' lev/'EVOLUTION' ; 'SI' ('EXISTE' lev) ; obj = lev ; lobj = VRAI ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; 'ARGUMENT' lm/'MAILLAGE' ; 'SI' ('EXISTE' lm) ; obj = lm ; lobj = VRAI ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; 'ARGUMENT' rig/'RIGIDITE' ; 'SI' ('EXISTE' rig) ; obj = rig ; lobj = VRAI ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; 'ARGUMENT' matk/'MATRIK' ; 'SI' ('EXISTE' matk) ; obj = matk ; lobj = VRAI ; 'FINSI' ; 'FINSI' ; 'SI' ('NON' lobj) ; cherr = 'CHAINE' 'Il faut fournir un objet liste, evolution, matrice ou chpoint.' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('EXISTE' tab itab) ; tab . itab = '+' (tab . itab) obj ; 'SINON' ; tab . itab = 'ET' (tab . itab) obj ; 'FINSI' ; 'SINON' ; tab . itab = obj ; 'FINSI' ; 'RESPRO' tab ; 'FINSI' ; 'ARGUMENT' lenti/'LISTENTI' ; 'ARGUMENT' lreel/'LISTREEL' ; 'SI' ('EXISTE' lenti) ; 'ARGUMENT' enti*'ENTIER' ; 'RESPRO' lenti ; 'FINSI' ; 'SI' ('EXISTE' lreel) ; 'ARGUMENT' reel*'FLOTTANT' ; 'RESPRO' lreel ; 'FINSI' ; * * End of procedure file APPEND * 'FINPROC' ; *ENDPROCEDUR append *BEGINPROCEDUR errrel ************************************************************************ * NOM : ERRREL * DESCRIPTION : Calcul d'une erreur relative * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 23/04/2003, version initiale * HISTORIQUE : v1, 23/04/2003, 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' 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 exmomod ************************************************************************ * NOM : EXMOMOD * DESCRIPTION : Extraction d'un mot d'un listmots * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 23/06/2003, version initiale * HISTORIQUE : v1, 23/06/2003, 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' EXMOMOD ; 'ARGUMENT' lm*'LISTMOTS' i*'ENTIER' ; k = '+' (MODULO ('-' i 1) j) 1 ; lemot = 'EXTRAIRE' lm k ; * Usage de l'opérateur text pour éviter que lemot * ne soit interprété comme un opérateur 'RESPRO' 'TEXTE' lemot ; * * End of procedure file EXMOMOD * 'FINPROC' ; *ENDPROCEDUR exmomod *BEGINPROCEDUR formar ************************************************************************ * NOM : FORMAR * DESCRIPTION : formate un réel de facon courte * pratique pour les noms de * sauvegarde * Exemples : * 'MESSAGE' ('CHAINE' (formar 2.9e5 1)) ; * 2.9E5 * 'MESSAGE' ('CHAINE' (formar -2.9e5 1)) ; * -2.9E5 * 'MESSAGE' ('CHAINE' (formar 2.9e-5 1)) ; * 2.9E-5 * 'MESSAGE' ('CHAINE' (formar -2.9e-5 1)) ; * -2.9E-5 * 'MESSAGE' ('CHAINE' (formar 2.9 1)) ; * 2.9 * 'MESSAGE' ('CHAINE' (formar -2.9 1)) ; * -2.9 * 'MESSAGE' ('CHAINE' (formar 0 1)) ; * 0 * 'MESSAGE' ('CHAINE' (formar 0 1)) ; * 0 * 'MESSAGE' ('CHAINE' (formar 2.9e5 0)) ; * 3E5 * 'MESSAGE' ('CHAINE' (formar -2.9e5 0)) ; * -3E5 * 'MESSAGE' ('CHAINE' (formar 2.9e-5 0)) ; * 3E-5 * 'MESSAGE' ('CHAINE' (formar -2.9e-5 0)) ; * -3E-5 * 'MESSAGE' ('CHAINE' (formar 2.9 0)) ; * 3 * 'MESSAGE' ('CHAINE' (formar -2.9 0)) ; * -3 * 'MESSAGE' ('CHAINE' (formar 0 0)) ; * 0 * 'MESSAGE' ('CHAINE' (formar 0 0)) ; * 0 * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 18/02/2003, version initiale * HISTORIQUE : v1, 18/02/2003, 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' FORMAR ; 'ARGUMENT' fl*'FLOTTANT' ; 'ARGUMENT' vir/'ENTIER ' ; 'SI' ('NON' ('EXISTE' vir)) ; vir = 1 ; 'SINON' ; 'SI' ('<' vir 0) ; 'ERREUR' 'fournir un entier positif' ; 'FINSI' ; 'FINSI' ; 'SI' ('<' ('ABS' fl) 10.D-100) ; chfl = 'CHAINE' '0' ; 'SINON' ; *! sans le 1.D-10, ca ne fonctionne pas *! qd on entre pile poil une puissance de 10 lfl = LOG10 ('ABS' fl) ; * lfl = '+' (LOG10 ('ABS' fl)) 1.D-10 ; slfl = 'SIGNE' ('ENTIER' lfl) ; 'SI' ('EGA' slfl 1) ; elfl = 'ENTIER' lfl ; 'SINON' ; elfl = '-' ('ENTIER' lfl) 1 ; 'FINSI' ; man = '/' fl ('**' 10.D0 elfl) ; * * Une verrue pour des histoires de précision... * 'SI' ('EGA' man 10.D0 ('**' 10.D0 ('*' vir -1.D0))) ; man = '/' man 10.D0 ; elfl = '+' elfl 1 ; 'FINSI' ; * sman = 'SIGNE' man ; 'SI' ('EGA' sman 1) ; fman = 'CHAINE' '(F' ('+' vir 2) '.0' vir ')' ; 'SINON' ; fman = 'CHAINE' '(F' ('+' vir 3) '.0' vir ')' ; 'FINSI' ; 'SI' ('NEG' vir 0) ; 'SI' ('NEG' elfl 0) ; chfl = 'CHAINE' 'FORMAT' fman man 'E' elfl ; 'SINON' ; chfl = 'CHAINE' 'FORMAT' fman man ; 'FINSI' ; 'SINON' ; man2 = 'ENTIER' ('+' man ('*' 0.5D0 sman)) ; 'SI' ('NEG' elfl 0) ; chfl = 'CHAINE' man2 'E' elfl ; 'SINON' ; chfl = 'CHAINE' man2 ; 'FINSI' ; 'FINSI' ; 'FINSI' ; 'RESPRO' chfl ; * * End of procedure file FORMAR * 'FINPROC' ; *ENDPROCEDUR formar *BEGINPROCEDUR getcoo ************************************************************************ * NOM : GETCOO * DESCRIPTION : * Renvoie les coordonnées des points dans un champ type déplacement * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' GETCOO ; 'ARGUMENT' mail*'MAILLAGE' ; 'ARGUMENT' incop*'LISTMOTS' ; * 'REPETER' iidim dim ; idim= &iidim ; ('COORDONNEE' idim mail) ; 'SI' ('EGA' idim 1) ; vcoo = icoo ; 'SINON' ; vcoo = 'ET' vcoo icoo ; 'FINSI' ; 'FIN' iidim ; 'RESPRO' vcoo ; * * End of procedure file GETCOO * 'FINPROC' ; *ENDPROCEDUR getcoo *BEGINPROCEDUR ggravi ************************************************************************ * NOM : GGRAVI * DESCRIPTION : Calcul de la force associée au potentiel gravitaire * (\rho g z si g vertical) * * * * 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' GGRAVI ; 'ARGUMENT' _surf*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; 'ARGUMENT' coef*'FLOTTANT' ; 'ARGUMENT' ang*'FLOTTANT' ; * pgrax = '*' ('COORDONNEE' 1 _surf) ('*' +1. ('SIN' ang)) ; pgraz = '*' ('COORDONNEE' vdim _surf) ('*' -1. ('COS' ang)) ; DISCG = TDISC . 'GEOM' . 'DISC' ; fpgrax = GNOR _surf tdisc 'NPRI' discg 'CPRI' pgrax 'NDUA' 'XN' ; fpgraz = GNOR _surf tdisc 'NPRI' discg 'CPRI' pgraz 'NDUA' 'XN' ; fpgra = '+' fpgrax fpgraz ; fpgra = '*' fpgra ('*' -1. coef) ; 'RESPRO' fpgra ; * * End of procedure file GGRAVI * 'FINPROC' ; *ENDPROCEDUR ggravi *BEGINPROCEDUR gkgravi ************************************************************************ * NOM : GKGRAVI * DESCRIPTION : Calcul de la matrice tangente de la force * associée au potentiel gravitaire (calculée par GGRAVI) * en fonction des déplacements des points de la surface. * * * * 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' GKGRAVI ; 'ARGUMENT' _surf*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; 'ARGUMENT' ijaco*'ENTIER' ; *'SI' ('NON' ('EXISTE' ijaco)) ; * ijaco = 0 ; *'FINSI' ; 'ARGUMENT' coef*'FLOTTANT' ; 'ARGUMENT' ang*'FLOTTANT' ; * pgrax = '*' ('COORDONNEE' 1 _surf) ('*' +1. ('SIN' ang)) ; pgraz = '*' ('COORDONNEE' vdim _surf) ('*' -1. ('COS' ang)) ; *pgra = '*' ('-' ('COORDONNEE' vdim _surf) H) -1. ; *pgra = '*' ('COORDONNEE' vdim _surf) -1. ; DISCG = TDISC . 'GEOM' . 'DISC' ; *fpgra = GNOR _surf tdisc 'NPRI' discg 'CPRI' pgra 'NDUA' 'XN' ; k1x = GNOR _surf tdisc 'NPRI' discg 'NDUA' 'XN' ; k1x = '*' k1x ('*' +1. ('SIN' ang)) ; k2x = GNORKTAN _surf tdisc 'NPRI' 'XN' 'NCOF' discg 'CCOF' pgrax 'NDUA' 'XN' ; k1z = GNOR _surf tdisc 'NPRI' discg 'NDUA' 'XN' ; k1z = '*' k1z ('*' -1. ('COS' ang)) ; k2z = GNORKTAN _surf tdisc 'NPRI' 'XN' 'NCOF' discg 'CCOF' pgraz 'NDUA' 'XN' ; 'SI' ('EGA' ijaco 0) ; ktgra = k1x 'ET' k1z 'ET' k2x 'ET' k2z ; 'FINSI' ; 'SI' ('EGA' ijaco 1) ; ktgra = k1x 'ET' k1z ; 'FINSI' ; 'SI' ('EGA' ijaco 2) ; ktgra = k2x 'ET' k2z ; 'FINSI' ; ktgra = '*' ktgra coef ; 'RESPRO' ktgra ; * * End of procedure file GKGRAVI * 'FINPROC' ; *ENDPROCEDUR gkgravi *BEGINPROCEDUR gkvol ************************************************************************ * NOM : GKVOL * DESCRIPTION : Matrice tangente associée à la variation du volume * contenu dans une surface (calculé par GVOL) * en fonction des déplacements des points de la surface. * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' GKVOL ; 'ARGUMENT' _surf*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; 'ARGUMENT' ijaco/'ENTIER' ; 'SI' ('NON' ('EXISTE' ijaco)) ; ijaco = 0 ; 'FINSI' ; * Vecteur position et calcul du volume DISCG = TDISC . 'GEOM' . 'DISC' ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ; fdim = 3 ; 'SINON' ; fdim = vdim ; 'FINSI' ; vpos = GETCOO _surf nomvit ; kvol1 = GNOR _surf tdisc 'NPRI' ('CHAINE' discg 'V') kvol2 = GNORKTAN _surf tdisc 'NPRI' ('CHAINE' discg 'V') 'NCOF' ('CHAINE' discg 'V') 'CCOF' vpos 'SI' ('EGA' ijaco 0) ; kvol = '/' ('+' kvol1 kvol2) fdim ; 'FINSI' ; 'SI' ('EGA' ijaco 1) ; kvol = '/' kvol1 fdim ; 'FINSI' ; 'SI' ('EGA' ijaco 2) ; kvol = '/' kvol2 fdim ; 'FINSI' ; 'RESPRO' kvol ; * * End of procedure file GKVOL * 'FINPROC' ; *ENDPROCEDUR gkvol *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 . 'NOMINC' . 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 . 'NOMINC' . 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 . 'NOMINC' . 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 *BEGINPROCEDUR gnorktan ************************************************************************ * NOM : GNORKTAN * DESCRIPTION : Matrice tangente associée à la variation de la normale * à une surface (calculée par GNOR) * en fonction des déplacements des points de la surface. * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' GNORKTAN ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; * * Lectures * 'SI' ('NEG' mdim ('-' dim 1)) ; 'ERREUR' 'Dim. maillage .neq. dim. espace - 1' ; 'FINSI' ; loi = 'CHAINE' 'VNOJ' ; 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 dim) ; cherr = 'CHAINE' 'la primale doit etre un vecteur' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('NEG' nincq dim) ; cherr = 'CHAINE' 'la duale doit etre un vecteur' ; 'ERREUR' cherr ; 'FINSI' ; ninc = dim ; * 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 ; deupi = '*' PI 2.D0 ; dprmt = '*' ('COORDONNEE' 1 _mt) deupi ; 'FINSI' ; * * Optimisation possible : construire la matrice par blocs * qd valt et valq ne sont pas donnés * numop = idim '*' idim '*' idim ; 'SI' iaxi ; numop = numop '+' idim ; 'FINSI' ; numder = idim ; numvar = ninct ; numdat = ncof ; numcof = ncof ; 'SI' lcof ; 'REPETER' iicof ncof ; icof = &iicof ; A . 'DAT' . icof . 'NOMDDL' = tcof . 'NOMINC' . 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' ; iop = 0 ; 'REPETER' iiinct ninct ; iinct = &iiinct ; A . 'VAR' . iinct . 'NOMDDL' = tnomt . 'NOMINC' . 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' ; 'REPETER' iiincq nincq ; 'REPETER' iiider numder ; iop = '+' iop 1 ; 'SI' lcof ; 'SINON' ; A . iop . iinct . &iiider = ll ; 'FINSI' ; 'FIN' iiider ; 'FIN' iiincq ; 'FIN' iiinct ; 'SI' iaxi ; 'REPETER' iiincq nincq ; iop = '+' iop 1 ; 'SI' lcof ; 'SINON' ; A . iop . 1 . 0 = ll ; 'FINSI' ; 'FIN' iiincq ; 'FINSI' ; * * 'SI' iaxi ; * numdat = 1 ; * numcof = dim '+' 1 ; * 'SINON' ; numdat = 0 ; numcof = idim '*' idim '*' idim ; * 'FINSI' ; 'SI' iaxi ; numdat = '+' numdat 2 ; numcof = '+' numcof ('+' idim 2) ; 'FINSI' ; numvar = nincq ; * 'REPETER' iiinc nincq ; iinc = &iiinc ; B . 'VAR' . iinc . 'NOMDDL' = tnomq . 'NOMINC' . 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 ; idat = 0 ; icof = 0 ; 'SI' iaxi ; 'REPETER' iiidim idim ; icof = '+' icof 1 ; B . 'COF' . icof . 'COMPOR' = 'CHAINE' 'VNOR' &iiidim ; 'FIN' iiidim ; idat = '+' idat 1 ; icof = '+' icof 1 ; B . 'DAT' . idat . 'DISC' = discg ; B . 'DAT' . idat . 'VALEUR' = dprmt ; B . 'COF' . icof . 'COMPOR' = 'IDEN' ; idat = '+' idat 1 ; icof = '+' icof 1 ; B . 'DAT' . idat . 'DISC' = 'CSTE' ; B . 'DAT' . idat . 'VALEUR' = deupi ; B . 'COF' . icof . 'COMPOR' = 'IDEN' ; 'SINON' ; 'FINSI' ; * iop = 0 ; 'REPETER' iiinct ninct ; 'REPETER' iiincq nincq ; 'REPETER' iiider numder ; iop = '+' iop 1 ; icof = '+' icof 1 ; lcomp = 'CHAINE' loi &iiincq &iiinct &iiider ; * lcomp = 'CHAINE' loi &iiinct &iiincq &iiider ; B . 'COF' . icof . 'COMPOR' = lcomp ; 'FIN' iiider ; 'FIN' iiincq ; 'FIN' iiinct ; 'SI' iaxi ; 'REPETER' iiincq nincq ; iincq = &iiincq ; iop = '+' iop 1 ; 'FIN' iiincq ; 'FINSI' ; * * mgnorkt = NLIN discg _mt A B 'CRES' methgau ; * 'RESPRO' mgnorkt ; 'FINPROC' ; * * End of procedure file GNORKTAN * *ENDPROCEDUR gnorktan *BEGINPROCEDUR gnor ************************************************************************ * NOM : GNOR * 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' GNOR ; '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 . 'NOMINC' . 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 . 'NOMINC' . 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 . 'NOMINC' . 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' mgnor ; 'FINPROC' ; * * End of procedure file GNOR * *ENDPROCEDUR gnor *BEGINPROCEDUR gvol ************************************************************************ * NOM : GVOL * DESCRIPTION : * Calcule le volume compris dans une surface fermée * La normale doit être vers l'intérieur pour que le volume soit positif * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' GVOL ; 'ARGUMENT' _surf*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; 'ARGUMENT' dbg/'LOGIQUE' ; * 'SI' ('NON' ('EXISTE' dbg)) ; dbg = FAUX ; 'FINSI' ; * * Vecteur position et calcul du volume DISCG = TDISC . 'GEOM' . 'DISC' ; 'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ; fdim = 3 ; 'SINON' ; fdim = vdim ; 'FINSI' ; vposc = GETCOO _surf nomvit ; * 'SI' iaxi ; * rs zs = 'COORDONNEE' _surf ; * nr = 'EXTRAIRE' nomvit 1 ; * nz = 'EXTRAIRE' nomvit 2 ; * vposc = * 'FINSI' ; * fvol = GNOR _surf tdisc 'NPRI' ('CHAINE' discg 'V') 'CPRI' vpos * 'NDUA' 'CSTEV' ; * rfvol = 'RESULT' fvol ; * volx = 'MAXIMUM' ('EXCO' 'UX' rfvol) ; * voly = 'MAXIMUM' ('EXCO' 'UY' rfvol) ; * vol = '/' ('+' volx voly) vdim ; fvolc = GNOR _surf tdisc 'NPRI' discg 'CCOF' vposc volc = '/' ('MAXIMUM' ('RESULT' fvolc)) fdim ; vol = volc '*' -1. ; 'RESPRO' vol ; * * End of procedure file GVOL * 'FINPROC' ; *ENDPROCEDUR gvol *BEGINPROCEDUR log10 ************************************************************************ * NOM : LOG10 * DESCRIPTION : Log_10 * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 18/02/2003, version initiale * HISTORIQUE : v1, 18/02/2003, 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' LOG10 ; 'REPETER' bouc ; ok = FAUX ; 'ARGUMENT' fl/'FLOTTANT' ; 'ARGUMENT' lr/'LISTREEL' ; 'ARGUMENT' cp/'CHPOINT ' ; 'ARGUMENT' cm/'MCHAML ' ; 'SI' ('EXISTE' fl) ; ok = VRAI ; 'RESPRO' ('/' ('LOG' fl) ('LOG' 10.D0)) ; 'FINSI' ; 'SI' ('EXISTE' lr) ; ok = VRAI ; 'RESPRO' ('/' ('LOG' lr) ('LOG' 10.D0)) ; 'FINSI' ; 'SI' ('EXISTE' cp) ; ok = VRAI ; 'RESPRO' ('/' ('LOG' cp) ('LOG' 10.D0)) ; 'FINSI' ; 'SI' ('EXISTE' cm) ; ok = VRAI ; 'RESPRO' ('/' ('LOG' cm) ('LOG' 10.D0)) ; 'FINSI' ; 'SI' ('NON' ok) ; 'QUITTER' bouc ; 'FINSI' ; 'FIN' bouc ; * * End of procedure file LOG10 * 'FINPROC' ; *ENDPROCEDUR log10 *BEGINPROCEDUR modulo ************************************************************************ * NOM : MODULO * DESCRIPTION : Calcule un entier modulo un autre... * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 15/10/2002, version initiale * HISTORIQUE : v1, 15/10/2002, 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' MODULO ; 'ARGUMENT' i*'ENTIER' j*'ENTIER' ; 'SI' ('EGA' j 0) ; 'MESSAGE' 'Impossible de faire modulo 0' ; 'ERREUR' 5 ; 'SINON' ; k=i '/' j ; mod=i '-' ( k '*'j ) ; 'RESPRO' mod ; 'FINSI' ; * * End of procedure file MODULO * 'FINPROC' ; *ENDPROCEDUR modulo *BEGINPROCEDUR projsysc ************************************************************************ * NOM : PROJSYSC * DESCRIPTION : Calcul matrice et second membre projetés suivant * un champ de directions données * * Project a linear system with respect to a given * vector field * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' PROJSYSC ; 'ARGUMENT' tdisc*'TABLE' ; 'ARGUMENT' vnorn*'CHPOINT' ; 'ARGUMENT' ktgra*'RIGIDITE' ; 'ARGUMENT' fpgra*'CHPOINT' ; 'ARGUMENT' kvol/'CHPOINT' ; lcnt = 'EXISTE' kvol ; 'SI' lcnt ; 'ARGUMENT' dvol*'FLOTTANT' ; 'FINSI' ; fpgran = 'PSCAL' fpgra vnorn nomvit nomvit ; * Condensation de la matrice * tknor = 'TABLE' 'ESCLAVE' ; * 'REPETER' idim vdim ; * lnomi = 'EXTRAIRE' nomvit ('LECT' &idim) ; * tknor . &idim = 'KOPS' 'MATDIAGO' lnomi * ('EXCO' lnomi vnorn lnomi) ; * 'FIN' idim ; * knord = 'ET' tknor ; 'SI' lmatrik ; 'SINON' ; knord = 'CHANGER' 'INCO' knord nomvit nomvit nomfor nomvit ; 'FINSI' ; 'SI' ('EGA' vdim 2) ; 'SINON' ; 'FINSI' ; knor = 'CHANGER' 'INCO' knord nomvit nomscal nomvit nomvit ; knort = 'CHANGER' 'INCO' knord nomvit nomvit nomvit nomscal ; 'SI' lmatrik ; 'SINON' ; ktgrak = ktgra ; 'FINSI' ; ktot = ktg3 ; ftot = fpgran ; 'SI' lcnt ; * 'MESSAGE' 'Une contrainte dans projsysc' ; ktvol = 'PSCAL' kvol vnorn nomvit nomvit ; smbvol = 'DEPIMPOSE' ktv dvol ; 'SI' lmatrik ; 'FINSI' ; ktot = ktot 'ET' ktv ; ftot = ftot '+' smbvol ; 'SINON' ; * 'MESSAGE' 'Pas de contrainte dans projsysc' ; 'FINSI' ; 'RESPRO' ktot ftot ; * * End of procedure file PROJSYSC * 'FINPROC' ; *ENDPROCEDUR projsysc *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 ; 'REPETER' bcl ; 'ARGUMENT' mquad/'MAILLAGE' ; 'SI' ('EXISTE' mquad) ; mquaf = 'CHANGER' mquad 'QUAF' ; * mlin = 'CHANGER' mquad 'LINEAIRE' ; 'RESPRO' mquaf ; 'SINON' ; 'QUITTER' bcl ; 'FINSI' ; 'FIN' bcl ; 'FINPROC' ; * * End of procedure file QUAFME * *ENDPROCEDUR quafme *BEGINPROCEDUR trvec ************************************************************************ * NOM : TRVEC * DESCRIPTION : Trace des champs de vecteurs. * Utile pour tracer des bilans de forces * * Display vector fields. * Useful for visualization of force balance. * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 22/04/2011, version initiale * HISTORIQUE : v1, 22/04/2011, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * * 'DEBPROC' TRVEC ; *'ARGUMENT' tdisc*'TABLE' ; *'ARGUMENT' motdom*'MOT' ; 'ARGUMENT' tdom*'MAILLAGE' ; * tvec = 'TABLE' ; ttit = 'TABLE' ; i = 0 ; lcoul = 'MOTS' 'JAUN' 'ROUG' 'BLAN' 'TURQ' 'VERT' 'OLIV' 'AZUR' 'ORAN' 'VIOL' 'GRIS' 'OCEA' ; * 'REPETER' livec ; 'SI' ('EGA' i 0) ; 'ARGUMENT' ccvec*'CHPOINT' ; 'SINON' ; 'ARGUMENT' ccvec/'CHPOINT' ; 'FINSI' ; 'SI' ('EXISTE' ccvec) ; 'SINON' ; 'QUITTER' livec ; 'FINSI' ; i = '+' i 1 ; * 'MESSAGE' ('CHAINE' 'i=' i) ; * 'LISTE' ccvec ; * 'LISTE' tvec ; tvec . i = ccvec ; ttit . i = ttvec ; 'FIN' livec ; 'ARGUMENT' echv/'FLOTTANT' ; 'ARGUMENT' lnclk/'LOGIQUE' ; 'SI' ('NON' ('EXISTE' lnclk)) ; lnclk = faux ; 'FINSI' ; * 'REPETER' ii i ; mm = 'MAXIMUM' (tvec . &ii) 'ABS' ; 'FIN' ii ; mm = '+' ('MAXIMUM' lmax) 1.D-60 ; 'SI' ('NON' ('EXISTE' echv)) ; ctail = gmass2 ('CHANGER' tdom 'QUAF') tdisc 'NPRI' 'CSTE' 'FPRI' 1. 'NDUA' 'CSTE' 'FDUA' 1. ; * 'LISTE' ctail ; * ctail = '**' ctail ('/' 1. ('-' vdim 1)) ; ctail = '**' ctail ('/' 1. dimm) ; *'LISTE' tail ; *'LISTE' mm ; 'FINSI' ; tit = 'CHAINE' 'Max. =' (formar mm 2) ; *'MESSAGE' ('CHAINE' 'mm=' mm) ; 'REPETER' ii i ; cou = EXMOMOD lcoul &ii ; tit = 'CHAINE' tit ' ' cou '=' (ttit . &ii) ; 'FIN' ii ; 'SI' lnclk ; 'SINON' ; 'FINSI' ; * * End of procedure file TRVEC * 'FINPROC' ; *ENDPROCEDUR trvec *BEGINPROCEDUR tsurfonc ************************************************************************ * NOM : TSURFONC * DESCRIPTION : La fonctionnelle à minimiser pour la tension * de surface * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 17/01/2007, version initiale * HISTORIQUE : v1, 17/01/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' TSURFONC ; 'ARGUMENT' _mt*'MAILLAGE' ; * * 'ARGUMENT' coef/'FLOTTANT' ; 'SI' ('NON' ('EXISTE' coef)) ; 'ARGUMENT' coef2/'CHPOINT ' ; 'SI' ('NON' ('EXISTE' coef2)) ; 'ERREUR' 'Il faut donner un coef FLOTTANT ou CHPOINT' ; 'SINON' ; coef = coef2 ; 'FINSI' ; 'SINON' ; discc = 'CSTE' ; 'FINSI' ; *'ARGUMENT' met/'CHPOINT' ; *lmet = 'EXISTE' met ; *'SI' lmet ; * debloi = 'CHAINE' 'ADD' ; * ncmet = '/' ('*' idim ('+' idim 1)) 2 ; * 'ARGUMENT' metdisc*'MOT' ; ** metdisc = gdisc ; *'SINON' ; * debloi = 'CHAINE' 'ADC' ; * ncmet = 0 ; *'FINSI' ; *loi = 'CHAINE' debloi 'F' ; * 'SI' ('EXISTE' optelem) ; lelem = VRAI ; 'SINON' ; cherr = 'CHAINE' 'Option ' optelem ' inconnue' ; 'ERREUR' cherr ; 'FINSI' ; 'SINON' ; lelem = FAUX ; 'FINSI' ; * * Calcul de la fonctionnelle * numop = 1 ; numvar = 1 ; numder = vdim ; numdat = 0 ; numcof = 0 ; * A . 'VAR' . 1 . 'DISC' = 'CSTE' ; A . 'VAR' . 1 . 'VALEUR' = 1.D0 ; * numvar = 1 ; numdat = 1 ; numcof = 1 ; B . 'VAR' . 1 . 'DISC' = 'CSTE' ; B . 'VAR' . 1 . 'VALEUR' = 1.D0 ; B . 'DAT' . 1 . 'DISC' = discc ; B . 'DAT' . 1 . 'VALEUR' = coef ; * B . 'COF' . 1 . 'COMPOR' = 'TSUF' ; * * * 'SI' ('NON' lelem) ; vfonc = 'MAXIMUM' ('RESULT' vfonc) ; 'FINSI' ; * 'RESPRO' vfonc ; * * End of procedure file TSURFONC * 'FINPROC' ; *ENDPROCEDUR tsurfonc *BEGINPROCEDUR tsurktan ************************************************************************ * NOM : TSURKTAN * DESCRIPTION : La matrice tangente pour la tension de surface * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 17/01/2007, version initiale * HISTORIQUE : v1, 17/01/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' TSURKTAN ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' dppri*'LISTMOTS' ; 'ARGUMENT' dpdua*'LISTMOTS' ; * dpdis = gdisc ; * * loi = 'CHAINE' 'TSUJ' ; loij = 'CHAINE' 'TSU' ; * 'ARGUMENT' coef/'FLOTTANT' ; 'SI' ('NON' ('EXISTE' coef)) ; 'ARGUMENT' coef2/'CHPOINT ' ; 'SI' ('NON' ('EXISTE' coef2)) ; 'ERREUR' 'Il faut donner un coef FLOTTANT ou CHPOINT' ; 'SINON' ; coef = coef2 ; 'FINSI' ; 'SINON' ; discc = 'CSTE' ; 'FINSI' ; * dir1 = VRAI ; 'FINSI' ; 'ARGUMENT' idir/'ENTIER' ; 'SI' ('EXISTE' idir) ; 'SI' ('EGA' idir 1) ; dir1 = VRAI ; 'FINSI' ; 'SINON' ; 'ARGUMENT' ldir/'LISTENTI' ; 'SI' ('NON' ('EXISTE' ldir)) ; dir1 = VRAI ; 'FINSI' ; 'FINSI' ; 'FINSI' ; 'ARGUMENT' lterm/'LISTENTI' ; llterm = 'EXISTE' lterm ; 'SI' llterm ; 'SINON' ; dlterm = 1 ; 'FINSI' ; * * Calcul du jacobien complet (jaco = 1) * numop = '*' ('**' vdim 2) ('**' idim 2) ; numop = '*' numop dlterm ; 'SI' ('OU' laxi lsph) ; numop = '+' numop ('*' (vdim '*' idim) 2) ; 'FINSI' ; 'SI' lsph ; numop = '+' numop 1 ; 'FINSI' ; numder = vdim ; numvar = idim ; numdat = 0 ; numcof = 0 ; * numdat = 1 ; numcof = numop ; 'REPETER' ivar numvar ; A . 'VAR' . &ivar . 'DISC' = dpdis ; B . 'VAR' . &ivar . 'DISC' = dpdis ; 'FIN' ivar ; iop = 0 ; 'REPETER' h dlterm ; 'REPETER' i idim ; 'REPETER' j vdim ; 'REPETER' k idim ; 'REPETER' l vdim ; iop = iop '+' 1 ; 'SI' llterm ; nl = 'EXTRAIRE' lterm &h ; nomloi = 'CHAINE' loij nl &i &j &k &l ; 'SINON' ; nomloi = 'CHAINE' loi &i &j &k &l ; 'FINSI' ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' l ; 'FIN' k ; 'FIN' j ; 'FIN' i ; 'FIN' h ; 'SI' ('OU' laxi lsph) ; 'REPETER' i idim ; 'REPETER' j vdim ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi &i &j '10' ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' j ; 'FIN' i ; 'REPETER' k idim ; 'REPETER' l vdim ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi '10' &k &l ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' l ; 'FIN' k ; 'FINSI' ; 'SI' lsph ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi '1010' ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FINSI' ; 'FINSI' ; numop = '*' nldir ('**' vdim 2) ; 'SI' dir1 ; 'SI' ('OU' laxi lsph) ; numop = '+' numop ('*' vdim 2) ; 'FINSI' ; 'SI' lsph ; numop = '+' numop 1 ; 'FINSI' ; 'FINSI' ; * numder = vdim ; numvar = idim ; numdat = 0 ; numcof = 0 ; * numdat = 1 ; numcof = numop ; 'REPETER' ivar numvar ; A . 'VAR' . &ivar . 'DISC' = dpdis ; B . 'VAR' . &ivar . 'DISC' = dpdis ; 'FIN' ivar ; iop = 0 ; 'REPETER' i nldir ; idir = 'EXTRAIRE' ldir &i ; 'REPETER' j vdim ; 'REPETER' l vdim ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi idir &j idir &l ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' l ; 'FIN' j ; 'FIN' i ; 'SI' dir1 ; 'SI' ('OU' laxi lsph) ; 'REPETER' j vdim ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi '1' &j '10' ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' j ; 'REPETER' l vdim ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi '101' &l ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' l ; 'FINSI' ; 'SI' lsph ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi '1010' ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * * numop = '**' vdim 2 ; numop = '*' nldir vdim ; 'SI' ('ET' dir1 lsph) ; numop = '+' numop 1 ; 'FINSI' ; * numder = vdim ; numvar = idim ; numdat = 0 ; numcof = 0 ; * numdat = 1 ; numcof = numop ; 'REPETER' ivar numvar ; A . 'VAR' . &ivar . 'DISC' = dpdis ; B . 'VAR' . &ivar . 'DISC' = dpdis ; 'FIN' ivar ; iop = 0 ; 'REPETER' i nldir ; idir = 'EXTRAIRE' ldir &i ; 'REPETER' j vdim ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi idir &j idir &j ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' j ; 'FIN' i ; 'SI' ('ET' dir1 lsph) ; iop = iop '+' 1 ; nomloi = 'CHAINE' loi '1010' ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FINSI' ; 'FINSI' ; * * Partie commune * B . 'DAT' . 1 . 'DISC' = discc ; B . 'DAT' . 1 . 'VALEUR' = coef ; * * 'RESPRO' jac ; * * End of procedure file TSURKTAN * 'FINPROC' ; *ENDPROCEDUR tsurktan *BEGINPROCEDUR tsurresi ************************************************************************ * NOM : TSURRESI * DESCRIPTION : Le résidu à annuler pour la tension de surface * * * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) * mél : gounand@semt2.smts.cea.fr ********************************************************************** * VERSION : v1, 17/01/2007, version initiale * HISTORIQUE : v1, 17/01/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' TSURRESI ; 'ARGUMENT' _mt*'MAILLAGE' ; 'ARGUMENT' dpdua*'LISTMOTS' ; * dpdis = gdisc ; * * loi = 'CHAINE' 'TSUR' ; * 'ARGUMENT' coef/'FLOTTANT' ; 'SI' ('NON' ('EXISTE' coef)) ; 'ARGUMENT' coef2/'CHPOINT ' ; 'SI' ('NON' ('EXISTE' coef2)) ; 'ERREUR' 'Il faut donner un coef FLOTTANT ou CHPOINT' ; 'SINON' ; coef = coef2 ; 'FINSI' ; 'SINON' ; discc = 'CSTE' ; 'FINSI' ; * dir1 = FAUX ; 'ARGUMENT' idir/'ENTIER' ; 'SI' ('EXISTE' idir) ; 'SI' ('EGA' idir 1) ; dir1 = VRAI ; 'FINSI' ; 'SINON' ; 'ARGUMENT' ldir/'LISTENTI' ; 'SI' ('NON' ('EXISTE' ldir)) ; dir1 = VRAI ; 'FINSI' ; 'FINSI' ; * * Calcul du résidu * * numop = '*' nldir vdim ; term1 = ('OU' laxi lsph) 'ET' dir1 ; 'SI' term1 ; numop = '+' numop 1 ; 'FINSI' ; numder = vdim ; numvar = 1 ; numdat = 0 ; numcof = 0 ; * A . 'VAR' . 1 . 'DISC' = 'CSTE' ; A . 'VAR' . 1 . 'VALEUR' = 1.D0 ; * numvar = idim ; numdat = 1 ; numcof = numop ; 'REPETER' ivar numvar ; B . 'VAR' . &ivar . 'DISC' = dpdis ; 'FIN' ivar ; * B . 'DAT' . 1 . 'DISC' = discc ; B . 'DAT' . 1 . 'VALEUR' = coef ; * iop = 0 ; 'REPETER' k nldir ; idir = 'EXTRAIRE' ldir &k ; 'REPETER' l vdim ; iop = '+' iop 1 ; nomloi = 'CHAINE' loi idir &l ; * 'MESSAGE' ('CHAINE' 'Nomloi=' nomloi) ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FIN' l ; 'FIN' k ; * 'LISTE' A ; 'LISTE' iop ; 'SI' term1 ; iop = '+' iop 1 ; nomloi = 'CHAINE' loi '10' ; B . 'COF' . iop . 'COMPOR' = nomloi ; 'FINSI' ; * * 'RESPRO' res ; * * End of procedure file TSURRESI * 'FINPROC' ; *ENDPROCEDUR tsurresi ** * COPTCLIM Copy a table with boundary conditions ** 'DEBPROC' COPTCLIM ; 'ARGUMENT' otclim*'TABLE' ; tclim = 'TABLE' ; iotclim = index otclim ; indx = iotclim . &ii ; tclim . indx = otclim . indx ; 'FIN' ii ; 'RESPRO' tclim ; 'FINPROC' ; ** * DIRDEP * Procédure créant le champ de direction selon lequel * les points se déplacent. * idir = 0 : les points se déplacent suivant la normale à la surface * idir = 1 : les points se déplacent suivant la direction passant par * 0. 0. * 'DEBPROC' DIRDEP ; 'ARGUMENT' _cmt*'MAILLAGE' ; 'ARGUMENT' cmt*'MAILLAGE' ; 'ARGUMENT' sur*'MAILLAGE' ; 'ARGUMENT' tdisc*'TABLE' ; 'ARGUMENT' idir/'ENTIER' ; 'SI' ('NON' ('EXISTE' idir)) ; idir = 0 ; 'FINSI' ; * * DISCG = TDISC . 'GEOM' . 'DISC' ; 'SI' ('EGA' idir 0) ; vnor = GNOR _cmt tdisc 'NPRI' discg 'FPRI' 1. 'NDUA' 'XN' ; vnor = '*' vnor -1. ; nvnor = '**' ('PSCAL' vnor vnor nomvit nomvit) 0.5 ; nvnor = '+' nvnor ('MASQUE' nvnor 'INFERIEUR' 1.D-100) ; vnorn = '/' vnor nvnor ; 'FINSI' ; 'SI' ('EGA' idir 1) ; vnor = GETCOO cmt nomvit ; nvnor = '**' ('PSCAL' vnor vnor nomvit nomvit) 0.5 ; nvnor = '+' nvnor ('MASQUE' nvnor 'INFERIEUR' 1.D-100) ; vnorn = '/' vnor nvnor ; 'FINSI' ; 'SI' ('EGA' idir 2) ; vnor1 = GNOR _cmt tdisc 'NPRI' discg 'FPRI' 1. 'NDUA' 'XN' ; vnor1 = '*' vnor1 -1. ; nvnor1 = '**' ('PSCAL' vnor1 vnor1 nomvit nomvit) 0.5 ; nvnor1 = '+' nvnor1 ('MASQUE' nvnor1 'INFERIEUR' 1.D-100) ; vnor1n = '/' vnor1 nvnor1 ; 'FINSI' ; * Cette formule peut poser problème en axi ! nvnor = '**' ('PSCAL' vnor vnor nomvit nomvit) 0.5 ; * 'LISTE' ('MAXIMUM' nvnor) ; * 'LISTE' ('MINIMUM' nvnor) ; nvnor = '+' nvnor ('MASQUE' nvnor 'INFERIEUR' 1.D-100) ; vnorn = '/' vnor nvnor ; * Correction de vnorn aux points extrémités pcmt = 'CHANGER' 'POI1' cmt ; mcorr = pB 'ET' pC ; pmcorr = 'CHANGER' 'POI1' mcorr ; vnorn = vnorn1 '+' vnorn2 '+' vnorn3 ; 'RESPRO' vnorn ; 'FINPROC' ; ** ************************************************************************ * * * END OF PROCEDURES * * ************************************************************************ ************************************************************************ * * * MAIN : 1) MESH * 2) COMPUTATIONAL LOOP * 3) TESTs if interact=FAUX ; * GUI if interact=VRAI ; * ************************************************************************ * * Construction du "modèle" (maillage) * et des paramètres de départ * idisc = 'QUAF' ; 'SI' complet ; nx = 25 ; 'SINON' ; nx = 5 ; 'FINSI' ; 'SI' interact ; critnewt = 2.D-3 ; nitermax = 25 ; omeg = 0.45 ; 'SINON' ; critnewt = 1.D-4 ; nitermax = 20 ; omeg = 1.0 ; 'FINSI' ; methgau = 'GAU7' ; idir = 1 ; jacoxf = 3 ; jacoxg = 0 ; jacoxv = 0 ; * * Création du maillage * pA = 0. 0. ; pB = 1. 0. ; pC = 0. 1. ; bas = 'DROIT' 1 pA pB ; sur = 'CERCLE' nx pB pA pC ; gau = 'DROIT' 1 pC pA ; cmt = bas 'ET' sur 'ET' gau ; tol = 1.D-5 ; _bas _sur _gau _cmt = QUAFME bas sur gau cmt ; 'ELIMINATION' (_bas 'ET' _sur 'ET' _gau 'ET' _cmt) 1.D-5 ; 'SI' ('EGA' idisc 'QUAF') ; cmt = _cmt ; 'FINSI' ; * ************************************************************************ * * COMPUTATIONAL LOOP * ************************************************************************ * * Bo : nombre de Bond (gravité / tension de surface) * ang : angle de la gravité par rapport à la verticale * * Structure de la table TCLIM pour les conditions aux limites * * En ENTREE : * cvol = vrai => Contrainte sur le volume * volv : volume cible * cvol = faux * dpv : différence de pression voulue * blocb = VRAI => Contrainte sur la position du point pB * rbv : rayon voulu du point B * blocb = FAUX * abv : angle de contact voulu au point B * blocc = VRAI => Contrainte sur la position du point pC * rcv : rayon voulu du point C * blocc = FAUX * acv : angle de contact voulu au point C * En SORTIE : * les mêmes indices sans le v final indiquent * les quantités trouvées par le calcul * * 'DEBPROC' calcul ; 'ARGUMENT' Bo*'FLOTTANT' ; 'ARGUMENT' ang*'FLOTTANT' ; 'ARGUMENT' tclim*'TABLE' ; * * * Création du "modèle" * 'SI' ('EGA' vdim 2) ; 'SI' ('NEG' vmod 'AXIS') ; 'SINON' ; 'FINSI' ; 'SINON' ; 'FINSI' ; * * TDISC = 'TABLE' ; TDISC . 'GEOM' = 'TABLE' ; TDISC . 'GEOM' . 'DISC' = idisc ; TDISC . 'XN' = 'TABLE' ; TDISC . 'XN' . 'DISC' = TDISC . 'GEOM' . 'DISC' ; TDISC . 'XN' . 'NOMINC' = 'TABLE' ; 'REPETER' idim vdim ; 'FIN' idim ; TDISC . 'FN' = 'TABLE' ; TDISC . 'FN' . 'DISC' = TDISC . 'GEOM' . 'DISC' ; TDISC . 'FN' . 'NOMINC' = 'TABLE' ; 'REPETER' idim vdim ; 'FIN' idim ; mdisc = 'EXTRAIRE' lmdisc &iidisc ; tdisc . mdisc = 'TABLE' ; tdisc . mdisc . 'DISC' = mdisc ; tdisc . mdisc . 'NOMINC' = 'TABLE' ; tdisc . mdisc . 'NOMINC' . 1 = nomsca ; mdiscv = 'CHAINE' mdisc 'V' ; tdisc . mdiscv = 'TABLE' ; tdisc . mdiscv . 'DISC' = mdisc ; tdisc . mdiscv . 'NOMINC' = 'TABLE' ; 'REPETER' idim vdim ; TDISC . mdiscv. 'NOMINC' . &idim = 'FIN' idim ; 'FIN' iidisc ; * DISCG = TDISC . 'GEOM' . 'DISC' ; DISCU = TDISC . 'XN' . 'DISC' ; * tdisc . 'cmt' = 'TABLE' ; tdisc . 'cmt' .'QUAF' = _cmt ; tdisc . 'cmt' .'LINE' = cmt ; tdisc . 'bas' = 'TABLE' ; tdisc . 'bas' .'QUAF' = _bas ; tdisc . 'bas' .'LINE' = bas ; tdisc . 'sur' = 'TABLE' ; tdisc . 'sur' .'QUAF' = _sur ; tdisc . 'sur' .'LINE' = sur ; tdisc . 'gau' = 'TABLE' ; tdisc . 'gau' .'QUAF' = _gau ; tdisc . 'gau' .'LINE' = gau ; * cmt = tdisc . 'cmt' . discg ; bas = tdisc . 'bas' . discg ; gau = tdisc . 'gau' . discg ; sur = tdisc . 'sur' . discg ; * * lok = vrai ; lquit = faux ; * * Boucle d'itérations (Newton) * tclim . 'fini' = 'FORME' ; vol = GVOL _cmt tdisc faux ; debug = faux ; 'SI' debug ; 'MESSAGE' ('CHAINE' 'Volume initial = ' (formar vol 2)) ; 'FINSI' ; 'REPETER' it nitermax ; tabres = 'TABLE' ; * Gravité fpgra = GGRAVI _cmt tdisc 1. ang ; ktgra = GKGRAVI _cmt tdisc jacoxg 1. ang ; fpgra = '*' fpgra Bo ; ktgra = '*' ktgra Bo ; tabres = append tabres 'ftot' fpgra ; tabres = append tabres 'ktot' ktgra ; * Tension de surface ftsur = TSURRESI _sur discg methgau nomvit -1. ; ktsur = TSURKTAN _sur discg methgau nomvit nomvit +1. jacoxt ; tabres = append tabres 'ftot' ftsur ; tabres = append tabres 'ktot' ktsur ; * Contrainte éventuelle sur le volume volc = GVOL _cmt tdisc ; dvol = ('-' (tclim . 'volv') volc) '*' -1. ; * 'MESSAGE' ('CHAINE' 'volc=' volc) ; 'SI' debug ; 'MESSAGE' ('CHAINE' '-volv volc=' dvol) ; 'FINSI' ; kvol = GKVOL _cmt tdisc jacoxv ; tabres = append tabres 'kcnt' kvol ; tabres . 'fcnt' = dvol ; 'SINON' ; fpvol = GNOR _cmt tdisc 'NPRI' 'CSTE' 'FPRI' ('*' (tclim . 'dpv') -1.) 'NDUA' 'XN' ; ktvol = GNORKTAN _cmt tdisc 'NPRI' 'XN' 'NCOF' 'CSTE' 'FCOF' ('*' (tclim . 'dpv') +1.) 'NDUA' 'XN' ; tabres = append tabres 'ftot' fpvol ; tabres = append tabres 'ktot' ktvol ; 'FINSI' ; * Conditions aux limites 'SI' (tclim . 'blob') ; rbc = 'COORDONNEE' 1 pB ; dr = ('-' (tclim . 'rbv') rbc) '*' +1. ; 'SI' debug ; 'MESSAGE' ('CHAINE' '- rbv rbc=' dr) ; 'FINSI' ; tabres = append tabres 'ccl' ccl ; 'SINON' ; * Force de bord delta = tclim . 'abv' ; sdel = 'SIN' delta ; fborb = TSURRESI _bas discg methgau nomvit ('*' -1. sdel) ; kborb = TSURKTAN _bas discg methgau nomvit nomvit ('*' +1. sdel) ; tabres = append tabres 'ftot' fborb ; tabres = append tabres 'ktot' kborb ; 'FINSI' ; * Conditions aux limites 'SI' (tclim . 'bloc') ; rcc = 'COORDONNEE' 2 pC ; dr = ('-' (tclim . 'rcv') rcc) '*' +1. ; 'SI' debug ; 'MESSAGE' ('CHAINE' '- rcv rcc=' dr) ; 'FINSI' ; append tabres 'ccl' ccl ; 'SINON' ; * Force de bord delta = tclim . 'acv' ; sdel = 'SIN' delta ; fborc = TSURRESI _gau discg methgau nomvit ('*' -1. sdel) ; kborc = TSURKTAN _gau discg methgau nomvit nomvit ('*' +1. sdel) ; tabres = append tabres 'ftot' fborc ; tabres = append tabres 'ktot' kborc ; 'FINSI' ; * Direction du déplacement des points de la surface vnor = GNOR _sur tdisc 'NPRI' discg 'FPRI' 1. 'NDUA' 'XN' ; vnorn = DIRDEP _cmt cmt sur tdisc idir ; * trvec cmt vnorn 'Vnorn' fpgra 'Fpgra' ftsur 'Ftsur' ; * fpvol 'Fpvol' ; * * Réduction du système sur l'inconnue déplacement normal * ktg = tabres . 'ktot' ; * * Convergence avec backtracking repris sur l'algorithme de * DEDU ADAP pas parfait... * fback = 2. ; fvdet = 6.D0 ; nback = 10 ; damp = omeg ; mtail = GMASS2 _sur tdisc 'NPRI' discg 'NDUA' discg ; dampi = damp ; deti = det0 ; backok = FAUX ; 'REPETER' iback nback ; 'SI' ('>' &iback 1) ; dampi = '/' dampi fback ; 'FINSI' ; 'SI' debug ; ch = 'CHAINE' ' dampi=' dampi ; 'MESSAGE' ch ; 'FINSI' ; ktg2 = '*' ktg ('/' 1. dampi) ; * ktg2 = ktg ; fpg = tabres . 'ftot' ; lcnt = 'EXISTE' tabres 'kcnt' ; 'SI' lcnt ; kvol = tabres . 'kcnt' ; dvol = tabres . 'fcnt' ; ktotp ftotp = PROJSYSC tdisc vnorn ktg2 fpg kvol dvol ; 'SINON' ; ktotp ftotp = PROJSYSC tdisc vnorn ktg2 fpg ; 'FINSI' ; ('CHANGER' 'POI1' sur) ; tabres = append tabres 'ccl' ccl ; 'SINON' ; ktotpr = ktotp ; ftotpr = ftotp ; 'FINSI' ; * 'LISTE' (tabres . 'ccl') ; * 'LDEPE' FAUX ; * sol = '*' sol dampi ; oldconf = 'FORME' ; 'FORME' deps ; * depsi = deps ; ndepsi = '**' ('PSCAL' depsi depsi nomvit nomvit) 0.5 ; ndr = '/' ndepsi taili ; mndr = 'MAXIMUM' ndr ; xs ys = 'COORDONNEE' sur ; '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 ; mixs = 'MINIMUM' xs ; miys = 'MINIMUM' ys ; 'SI' debug ; 'FINSI' ; bigvar = 'OU' ('>' mavd fvdet) ('<' mivd ('/' 1.D0 fvdet)) 'OU' ('>' mndr ('-' fvdet 1.)) 'OU' ('<EG' mixs -1.D-5) 'OU' ('<EG' miys -1.D-5) ; 'SI' bigvar ; 'SI' debug ; ch = 'CHAINE' ' Warn : trop grande variation du jaco !' ; 'MESSAGE' ch ; 'FINSI' ; 'SINON' ; backok = VRAI ; 'QUITTER' iback ; 'FINSI' ; 'FINSI' ; 'FIN' iback ; * * On peut avoir un problème à la première itération si * les contraintes ne sont pas vérifiées au départ * 'SI' ('ET' ('NON' backok) ('NEG' &it 1)) ; chinfo1 = 'CHAINE' 'Backtracking failed to converge !' ; 'MESSAGE' chinfo1 ; chinfo2 = 'CHAINE' 'Please check the output displacement' ; 'MESSAGE' chinfo2 ; * 'SI' ('NEG' &it 1) ; * lok = faux ; * lquit = vrai ; * 'FINSI' ; 'FINSI' ; * freac = (ktotpr '*' sol) '-' ftotpr ; odep = dep ; * * Bilan des forces * fpgrann = '*' ('PSCAL' fpgra vnorn nomvit nomvit) vnorn ; ftsurnn = '*' ('PSCAL' ftsur vnorn nomvit nomvit) vnorn ; fpvolnn = '*' ('*' ktotp ('*' mulag -1.)) vnorn ; 'SINON' ; fpvolnn = '*' ('PSCAL' fpvol vnorn nomvit nomvit) vnorn ; 'FINSI' ; 'SI' (tclim . 'blob') ; 'SINON' ; fborbnn = '*' ('PSCAL' fborb vnorn nomvit nomvit) vnorn ; 'FINSI' ; 'SI' (tclim . 'bloc') ; 'SINON' ; fborcnn = '*' ('PSCAL' fborc vnorn nomvit nomvit) vnorn ; 'FINSI' ; * Bilan des forces normales en surface desfnn = fpvolnn '+' fpgrann '+' ftsurnn '+' fborbnn '+' fborcnn ; * tclim . 'dp' = 'MAXIMUM' mulag ; 'SINON' ; tclim . 'dp' = tclim . 'dpv' ; 'FINSI' ; * maxdepr = 'MAXIMUM' dep 'ABS' ; 'SI' debug ; 'MESSAGE' ('CHAINE' 'Maxdepr=' maxdepr) ; 'FINSI' ; fbornn = fborcnn '+' fborbnn ; 'SI' graph ; * TRVEC sur fpgrann 'gran' fpvolnn 'voln' * ftsurnn 'tsun' fbornn 'born' desfnn 'desn' VRAI ; TRVEC cmt dep ('CHAINE' 'Deplacement') 1. VRAI ; 'FINSI' ; 'SI' ('<' maxdepr critnewt) ; lquit = vrai ; 'FINSI' ; * 'SI' ('>' maxdepr ('+' ('ABS' dx) 0.5)) ; * 'SI' ('>' maxdepr 6.) ; * lok = faux ; * lquit = vrai ; * 'FINSI' ; * 'OPTION' 'DONN' 5 ; * Extension du déplacement sur les points de l'axe et du haut * pour les quadratiques ! * 'SI' lok ; 'SI' ('EGA' idisc 'QUAF') ; nv21 = 'EXTRAIRE' nomvit2 1 ; nv22 = 'EXTRAIRE' nomvit2 2 ; nv1 = 'EXTRAIRE' nomvit 1 ; nv2 = 'EXTRAIRE' nomvit 2 ; bux = 'BLOQUE' nv21 gau ; buy = 'BLOQUE' nv22 bas ; btot = bux 'ET' buy 'ET' bs ; ftot = fs ; 'NATURE' 'DIFFUS' ; * 'LISTE' odep ; * 'LISTE' dx ; odep = odep 'ET' dx ; 'FINSI' ; 'FORME' odep ; * Eventuelle régularisation ? 'SI' faux ; vnor = GNOR _sur tdisc 'NPRI' discg 'FPRI' +1. 'NDUA' 'XN' ; dx = deduad2 sur (b1 'ET' b2) 'NITM' 1 ; ndepsi = '**' ('PSCAL' depsi depsi nomvit nomvit) 0.5 ; ndr = '/' ndepsi taili ; mndr = 'MAXIMUM' ndr ; 'SI' ('>' mndr 0.5) ; cof = '/' 0.5 mndr ; dx = '*' dx cof ; 'FINSI' ; * trvec sur dx 'dxreg' 1. ; 'FORME' dx ; 'FINSI' ; 'FINSI' ; * La normale intégrée est nulle sur l'axe avec des quadratiques... vnor = GNOR _sur tdisc 'NPRI' discg 'FPRI' +1. 'NDUA' 'XN' ; * trvec cmt vnor 'VNor' ; vnbx = 'EXTRAIRE' vnor ('EXTRAIRE' nomvit 1) pB ; vnby = 'EXTRAIRE' vnor ('EXTRAIRE' nomvit 2) pB ; vnb = vnbx vnby ; fbux = 'COORDONNEE' 1 fb ; fbuy = 'COORDONNEE' 2 fb ; * fbux = 'EXTRAIRE' ftsur ('EXTRAIRE' nomvit 1) pB ; * fbuy = 'EXTRAIRE' ftsur ('EXTRAIRE' nomvit 2) pB ; fb = fbux fbuy ; * 'LISTE' fb ; 'LISTE' nfb ; tclim . 'ab' = 'ASIN' ('/' ('*' fbux -1.) nfb) ; * tclim . 'ab' = 'ATG' fbux fbuy ; vncx = 'EXTRAIRE' vnor ('EXTRAIRE' nomvit 1) pC ; vncy = 'EXTRAIRE' vnor ('EXTRAIRE' nomvit 2) pC ; vnc = vncx vncy ; fcux = 'COORDONNEE' 1 fc ; fcuy = 'COORDONNEE' 2 fc ; * fcux = 'EXTRAIRE' ftsur ('EXTRAIRE' nomvit 1) pC ; * fcuy = 'EXTRAIRE' ftsur ('EXTRAIRE' nomvit 2) pC ; fc = fcux fcuy ; * 'LISTE' fc ; liste nfc ; tclim . 'ac' = 'ASIN' ('/' ('*' fcuy +1.) nfc) ; * tclim . 'ac' = 'ATG' fcuy fcux ; tclim . 'vol' = GVOL _cmt tdisc faux ; tclim . 'rb' = 'COORDONNEE' 1 pB ; tclim . 'rc' = 'COORDONNEE' 2 pC ; * 'LISTE' tclim ; * 'OPTION' 'DONN' 5 ; 'SI' lquit ; 'QUITTER' it ; 'FINSI' ; 'FIN' it ; 'SI' ('NON' lquit) ; lok = faux ; 'FINSI' ; 'SI' (graph 'ET' faux) ; * TRVEC cmt dep ('CHAINE' 'Depl omeg=' (formar omeg 1)) 1. ; fbornn = fborcnn '+' fborbnn ; TRVEC sur fpgrann 'gran' fpvolnn 'voln' ftsurnn 'tsun' fbornn 'born' desfnn 'desn' ; fpvol = GNOR _cmt tdisc 'NPRI' 'CSTE' 'FPRI' ('*' (tclim . 'dp') -1.) 'NDUA' 'XN' ; desf = fpvol '+' fpgra '+' ftsur ; TRVEC sur fpgrai 'grai' fpvoli 'voli' ftsuri 'tsui' desfi 'desi' ; TRVEC sur desfi 'desi' ; * 'OPTION' 'DONN' 5 ; * Bilan des forces en surface * fpgrat = '-' fpgra fpgrann ; * ftsurt = '-' ftsur ftsurnn ; * desft = fpgrat '+' ftsurt ; * psurm = 'DIFF' ('CHANGER' 'POI1' sur) (pB 'ET' pC) ; * fpgrat = 'REDU' fpgrat psurm ; * ftsurt = 'REDU' ftsurt psurm ; * desft = 'REDU' desft psurm ; * TRVEC sur fpgrat 'grat' * ftsurt 'tsut' desft 'dest' ; * 'OPTION' 'DONN' 5 ; 'FINSI' ; 'RESPRO' lok ; 'FINPROC' ; ************************************************************************ * * END OF COMPUTATIONAL LOOP * ************************************************************************ * 'SI' interact ; ************************************************************************ * * GUI PART * ************************************************************************ tclim = 'TABLE' ; * 'SINON' ; 'FINSI' ; tclim . 'blob' = faux ; tclim . 'abv' = 0. ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; * Bo = 1.D-6 ; ang = 0. ; lok = CALCUL Bo ang tclim ; *'LISTE' tclim ; 'SI' ('NON' lok) ; 'MESSAGE' 'Pb: pas detat initial!' ; 'FINSI' ; 'REPETER' bouc1 ; 'SI' laxi ; tit = 'CHAINE' 'Axi' ; 'SINON' ; tit = 'CHAINE' 'Plane' ; 'FINSI' ; tit = 'CHAINE' tit ' Bo=' (formar Bo 2) ; 'SI' ('NON' laxi) ; tit = 'CHAINE' tit ' angg=' (formar ang 2) ; 'FINSI' ; tit = 'CHAINE' tit ('CHAINE' ' vol=' (formar (tclim . 'volv') 2)) ; 'SINON' ; tit = 'CHAINE' tit ('CHAINE' ' dpv=' (formar (tclim . 'dpv') 2)) ; 'FINSI' ; 'SI' (tclim . 'blob') ; tit = 'CHAINE' tit ('CHAINE' ' rbv=' (formar (tclim . 'rbv') 2)) ; 'SINON' ; tit = 'CHAINE' tit ('CHAINE' ' abv=' (formar (tclim . 'abv') 2)) ; 'FINSI' ; 'SI' (tclim . 'bloc') ; tit = 'CHAINE' tit ('CHAINE' ' rcv=' (formar (tclim . 'rcv') 2)) ; 'SINON' ; tit = 'CHAINE' tit ('CHAINE' ' acv=' (formar (tclim . 'acv') 2)) ; 'FINSI' ; 'TRACER' cmt 'TITR' tit 'NCLK' ; oBo = Bo ; oang = ang ; otclim = coptclim tclim ; ofor = 'FORME' ; * * Menu items * tmenu = 'TABLE' ; imenu = 0 ; tquest = 'TABLE' ; imenu = '+' imenu 1 ; tmenu . imenu = 'Bond' ; (formar Bo 2) ')' ; imenu = '+' imenu 1 ; tmenu . imenu = 'Angg' ; tquest . imenu = 'CHAINE' 'Gravity direction/downward in degrees ? (' (formar ang 2) ')' ; 'FINSI' ; imenu = '+' imenu 1 ; tmenu . imenu = 'Volume' ; tquest . imenu = 'CHAINE' 'Prescribed volume ? (' (formar (tclim . 'volv') 2) ')' ; 'SINON' ; tmenu . imenu = 'DeltaP' ; tquest . imenu = 'CHAINE' 'Prescribed pressure difference ? (' (formar (tclim . 'dpv') 2) ')' ; 'FINSI' ; imenu = '+' imenu 1 ; 'SI' (tclim . 'blob') ; tmenu . imenu = 'RadB' ; tquest . imenu = 'CHAINE' 'Prescribed radius at B (lower right) ? (' (formar (tclim . 'rbv') 2) ')' ; 'SINON' ; tmenu . imenu = 'AngB' ; tquest . imenu = 'CHAINE' 'Prescribed angle at B (lower right) in degrees ? (' (formar (tclim . 'abv') 2) ')' ; 'FINSI' ; imenu = '+' imenu 1 ; 'SI' (tclim . 'bloc') ; tmenu . imenu = 'RadC' ; tquest . imenu = 'CHAINE' 'Prescribed radius at C (upper left) ? (' (formar (tclim . 'rcv') 2) ')' ; 'SINON' ; tmenu . imenu = 'AngC' ; tquest . imenu = 'CHAINE' 'Prescribed angle at C (upper left) in degrees ? (' (formar (tclim . 'acv') 2) ')' ; 'FINSI' ; 'FINSI' ; imenu = '+' imenu 1 ; tmenu . imenu = 'Options' ; * * Menu display * 'SI' ('EGA' imenu 4) ; 'SINON' ; (tmenu . 5) (tmenu . 6) ; 'FINSI' ; * * Menu actions * 'SI' ('ET' ('NEG' ret 'Quitter') ('NEG' ret 'Options')) ; irep = 0 ; 'SI' ('EGA' ret (tmenu . &ii)) ; irep = &ii ; 'FINSI' ; 'FIN' ii ; 'SI' ('EGA' irep 0) ; cherr = 'CHAINE' 'Option ' ret ' unknown' ; 'ERREUR' cherr ; 'FINSI' ; 'SI' ('EGA' ret 'Bond') ; Bo = val ; 'FINSI' ; 'SI' ('EGA' ret 'Angg') ; ang = val ; 'FINSI' ; 'SI' ('EGA' ret 'Volume') ; tclim . 'volv' = 'ABS' val ; 'FINSI' ; 'SI' ('EGA' ret 'DeltaP') ; tclim . 'dpv' = val ; 'FINSI' ; 'SI' ('EGA' ret 'RadB') ; tclim . 'rbv' = 'ABS' val ; 'FINSI' ; 'SI' ('EGA' ret 'AngB') ; tclim . 'abv' = val ; 'FINSI' ; 'SI' ('EGA' ret 'RadC') ; tclim . 'rcv' = 'ABS' val ; 'FINSI' ; 'SI' ('EGA' ret 'AngC') ; tclim . 'acv' = val ; 'FINSI' ; 'FINSI' ; 'SI' ('EGA' ret 'Quitter') ; 'REPETER' bquit ; 'SI' ('EGA' val 'Y') ; 'QUITTER' bouc1 ; 'FINSI' ; 'SI' ('EGA' val 'N') ; 'QUITTER' bquit ; 'FINSI' ; 'FIN' bquit ; 'FINSI' ; 'SI' ('EGA' ret 'Options') ; radiusb = tclim . 'blob' ; radiusc = tclim . 'bloc' ; titchoi = 'CHAINE' 'Check options : plane/axi vol./press. ' 'radius/angle@B radius/angle@C' ; axi volume radiusb radiusc = 'CHOI' titchoi axi volume radiusb radiusc ; 'SI' axi ; ang = 0 ; radiusc = FAUX ; tclim . 'acv' = 0. ; 'SINON' ; 'FINSI' ; tclim . 'blob' = radiusb ; tclim . 'bloc' = radiusc ; 'SI' volume ; 'SI' ('NON' ('EXISTE' tclim 'volv')) ; tclim . 'volv' = tclim . 'vol' ; 'OUBLIER' tclim 'dpv' ; 'FINSI' ; 'SINON' ; 'SI' ('NON' ('EXISTE' tclim 'dpv')) ; tclim . 'dpv' = tclim . 'dp' ; 'OUBLIER' tclim 'volv' ; 'FINSI' ; 'FINSI' ; 'SI' radiusb ; 'SI' ('NON' ('EXISTE' tclim 'rbv')) ; tclim . 'rbv' = tclim . 'rb' ; 'OUBLIER' tclim 'abv' ; 'FINSI' ; 'SINON' ; 'SI' ('NON' ('EXISTE' tclim 'abv')) ; tclim . 'abv' = tclim . 'ab' ; 'OUBLIER' tclim 'rbv' ; 'FINSI' ; 'FINSI' ; 'SI' radiusc ; 'SI' ('NON' ('EXISTE' tclim 'rcv')) ; tclim . 'rcv' = tclim . 'rc' ; 'OUBLIER' tclim 'acv' ; 'FINSI' ; 'SINON' ; 'SI' ('NON' ('EXISTE' tclim 'acv')) ; tclim . 'acv' = tclim . 'ac' ; 'OUBLIER' tclim 'rcv' ; 'FINSI' ; 'FINSI' ; 'FINSI' ; * * New shape * 'SI' ('NEG' ret 'Quitter') ; lok = CALCUL Bo ang tclim ; * 'LISTE' tclim ; 'SI' ('NON' lok) ; 'MESSAGE' 'Convergence error !!!' ; Bo = oBo ; ang = oang ; tclim = otclim ; 'FORME' ofor ; 'FINSI' ; 'FINSI' ; 'FIN' bouc1 ; ************************************************************************ * * END OF GUI PART * ************************************************************************ 'FINSI' ; 'SI' ('NON' interact) ; ************************************************************************ * * TEST PART * ************************************************************************ lpass = VRAI ; * *** *** Test 1 Plane circular drop, Prescribed contact angle = 90 degrees. *** Prescribed volume = 1. *** No gravity *** Test on radius R and pressure difference \delta P *** 2D Laplace-Young's law tells \delta P = \gamma / R. *** Here \gamma = 1 (non dimensional) * * Computation * vol = 1. ; tclim = 'TABLE' ; tclim . 'blob' = faux ; tclim . 'abv' = 0. ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; Bo = 1.D-6 ; ang = 0. ; lok = CALCUL Bo ang tclim ; * list tclim ; * * Reference values * * V = \frac{\pi R^2}{4} rref = '**' ('/' ('*' vol 4.) PI) 0.5 ; dpref = '/' 1. rref ; * * Tests * rb = tclim . 'rb' ; rc = tclim . 'rc' ; dp = tclim . 'dp' ; AFFVAR rref 'rref' rb 'rb' rc 'rc' ; AFFVAR dpref 'dpref' dp 'dp' ; errv = 2.D-4 ; err1 = errrel rb rref ; tst1 = '<' err1 errv ; err2 = errrel rc rref ; tst2 = '<' err2 errv ; err3 = errrel dp dpref ; tst3 = '<' err3 errv ; tst = lok 'ET' tst1 'ET' tst2 'ET' tst3 ; 'MESSAGE' ('CHAINE' 'Test 1 : lok = ' lok) ; 'MESSAGE' ' err1 = ' err1 ; 'MESSAGE' ' err2 = ' err2 ; 'MESSAGE' ' err3 = ' err3 ; 'SI' tst ; 'MESSAGE' 'Test 1 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 1 not passed ' ; 'FINSI' ; *'OPTION' 'DONN' 5 ; lpass = lpass 'ET' tst ; *** *** Test 2 Plane circular drop, Prescribed contact angle at B = 70 degrees. *** Prescribed volume = 1. *** No gravity *** Test on position of B (xB, 0) and C (0, yC) *** versus analytical solution * * Computation * vol = 1. ; alpha = 20. ; alphar = '*' alpha ('/' PI 180.) ; tclim = 'TABLE' ; tclim . 'blob' = faux ; tclim . 'abv' = -1. '*' alpha ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; Bo = 1.D-6 ; ang = 0. ; lok = CALCUL Bo ang tclim ; *'LISTE' tclim ; * * Reference values * * V = \frac{R^2}{4} (\pi - 2\alpha - sin 2\alpha) (\alpha in radians) * xB = R \cos \alpha * yC = R (1 - \sin \alpha) dar = '*' alphar 2. ; da = '*' alpha 2. ; rref = '**' ('/' ('*' vol 4.) (PI '-' dar '-' ('SIN' da))) 0.5 ; xbref = rref '*' ('COS' alpha) ; ycref = rref '*' ('-' 1. ('SIN' alpha)) ; * * Tests * xb = tclim . 'rb' ; yc = tclim . 'rc' ; AFFVAR xbref 'xbref' xb 'xb' ; AFFVAR ycref 'ycref' yc 'yc' ; errv = 2.D-4 ; err1 = errrel xb xbref ; tst1 = '<' err1 errv ; err2 = errrel yc ycref ; tst2 = '<' err2 errv ; tst = lok 'ET' tst1 'ET' tst2 ; 'MESSAGE' ('CHAINE' 'Test 2 : lok = ' lok) ; 'MESSAGE' ' err1 = ' err1 ; 'MESSAGE' ' err2 = ' err2 ; 'SI' tst ; 'MESSAGE' 'Test 2 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 2 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; *** *** Test 3 Plane drop, Prescribed contact angle at B = 70 degrees. *** Prescribed volume = 1. *** Bond = -1. (upward gravity) *** Test on position of C (0, yC) *** versus numerical solution \cite{sumesh}, figure 2 * * Computation * vol = 1. ; alpha = 20. ; alphar = '*' alpha ('/' PI 180.) ; tclim = 'TABLE' ; tclim . 'blob' = faux ; tclim . 'abv' = -1. '*' alpha ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; Bo = -1.D0 ; ang = 0. ; lok = CALCUL Bo ang tclim ; *'LISTE' tclim ; * * Reference values * ycref = 1.20 ; * * Tests * yc = tclim . 'rc' ; AFFVAR ycref 'ycref' yc 'yc' ; errv = 1.D-2 ; err1 = errrel yc ycref ; tst1 = '<' err1 errv ; tst = lok 'ET' tst1 ; 'MESSAGE' ('CHAINE' 'Test 3 : lok = ' lok) ; 'MESSAGE' ' err1 = ' err1 ; 'SI' tst ; 'MESSAGE' 'Test 3 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 3 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; *** *** Test 4 Axisymmetric spherical drop, *** Prescribed contact angle = 90 degrees. *** Prescribed pressure difference *** such that volume= 3 PI / 2 *** No gravity *** Test on radius at B and C and volume V *** 3D Laplace-Young's law tells \delta P = 2 \gamma / R. *** Here \gamma = 1 (non dimensional) * * Computation * volref = '/' ('*' PI 3.) 2. ; * * Reference values * * V = \frac{2 \pi R^3}{3} rref = '**' ('/' ('*' volref 3.) ('*' 2. PI)) ('/' 1. 3.) ; dpref = '/' 2. rref ; * tclim = 'TABLE' ; tclim . 'blob' = faux ; tclim . 'abv' = 0. ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; Bo = 1.D-6 ; ang = 0. ; lok = CALCUL Bo ang tclim ; *'LISTE' tclim ; * * Tests * rb = tclim . 'rb' ; rc = tclim . 'rc' ; vol = tclim . 'vol' ; AFFVAR rref 'rref' rb 'rb' rc 'rc' ; AFFVAR volref 'volref' vol 'vol' ; errv = 2.D-4 ; err1 = errrel rb rref ; tst1 = '<' err1 errv ; err2 = errrel rc rref ; tst2 = '<' err2 errv ; err3 = errrel vol volref ; tst3 = '<' err3 errv ; tst = lok 'ET' tst1 'ET' tst2 'ET' tst3 ; 'MESSAGE' ('CHAINE' 'Test 4 : lok = ' lok) ; 'MESSAGE' ' err1 = ' err1 ; 'MESSAGE' ' err2 = ' err2 ; 'MESSAGE' ' err3 = ' err3 ; 'SI' tst ; 'MESSAGE' 'Test 4 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 4 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; *** *** Test 5 Axisymmetric spherical drop, *** Prescribed contact angle at B = 50 degrees. *** Prescribed volume = 3 PI / 2 *** No gravity *** Test on position of B (xB, 0) and C (0, yC) *** versus analytical solution * * Computation * vol = '/' ('*' PI 3.) 2. ; alpha = 40. ; tclim = 'TABLE' ; tclim . 'blob' = faux ; tclim . 'abv' = -1. '*' alpha ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; Bo = 1.D-6 ; ang = 0. ; lok = CALCUL Bo ang tclim ; *'LISTE' tclim ; * * Reference values * * V = \pi \frac{R^3}{3} (1 - sin \alpha)^2 (2 + sin \alpha) * rB = R \cos \alpha * zC = R (1 - \sin \alpha) rref = '**' ('/' ('*' vol 3.) (PI '*' ('**' ('-' 1. ('SIN' alpha)) 2.) '*' ('+' 2. ('SIN' alpha))) ) ('/' 1. 3.) ; rbref = rref '*' ('COS' alpha) ; zcref = rref '*' ('-' 1. ('SIN' alpha)) ; * * Tests * rb = tclim . 'rb' ; zc = tclim . 'rc' ; AFFVAR rbref 'rbref' rb 'rb' ; AFFVAR zcref 'zcref' zc 'zc' ; errv = 2.D-4 ; err1 = errrel rb rbref ; tst1 = '<' err1 errv ; err2 = errrel zc zcref ; tst2 = '<' err2 errv ; tst = lok 'ET' tst1 'ET' tst2 ; 'MESSAGE' ('CHAINE' 'Test 5 : lok = ' lok) ; 'MESSAGE' ' err1 = ' err1 ; 'MESSAGE' ' err2 = ' err2 ; 'SI' tst ; 'MESSAGE' 'Test 5 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 5 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; *** *** Test 6 Axisymmetric drop, Prescribed contact angle at B = 50 degrees. *** Prescribed volume = 3 PI / 2 *** Bond = -1. (upward gravity) *** Test on position of C (0, zC) *** versus numerical solution \cite{sumesh}, figure 8 * * Computation * vol = '/' ('*' PI 3.) 2. ; alpha = 40. ; tclim = 'TABLE' ; tclim . 'blob' = faux ; tclim . 'abv' = -1. '*' alpha ; tclim . 'bloc' = faux ; tclim . 'acv' = 0. ; Bo = -1.D0 ; ang = 0. ; lok = CALCUL Bo ang tclim ; *'LISTE' tclim ; * * Reference values * *zcref = 0.90 ; zcref = 1.094 ; * * Tests * zc = tclim . 'rc' ; AFFVAR zcref 'zcref' zc 'zc' ; errv = 1.D-2 ; err1 = errrel zc zcref ; tst1 = '<' err1 errv ; tst = lok 'ET' tst1 ; 'MESSAGE' ('CHAINE' 'Test 6 : lok = ' lok) ; 'MESSAGE' ' err1 = ' err1 ; 'SI' tst ; 'MESSAGE' 'Test 6 OK' ; 'SINON' ; 'MESSAGE' '!!! Test 6 not passed ' ; 'FINSI' ; lpass = lpass 'ET' tst ; '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