* fichier :  kops_rima.dgibi
'OPTI' echo 0 ;
************************************************************************
* NOM         : KOPS_RIMA
* DESCRIPTION : On vérifie que KOPS RIMA donne des résultats corrects
*
*
*
* LANGAGE     : GIBIANE-CAST3M
* AUTEUR      : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
*               mél : gounand@semt2.smts.cea.fr
**********************************************************************
* VERSION    : v1, 03/01/2013, version initiale
* HISTORIQUE : v1, 03/01/2013, création
* HISTORIQUE :
* HISTORIQUE :
************************************************************************
*
interact = FAUX ;
graph=FAUX;
* 
*BEGINPROCEDUR gdiv
************************************************************************
* NOM         : GDIV
* DESCRIPTION : 
*
*
*
* LANGAGE     : GIBIANE-CAST3M
* AUTEUR      : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
*               mél : gounand@semt2.smts.cea.fr
**********************************************************************
* VERSION    : v1, 08/03/2006, version initiale
* HISTORIQUE : v1, 08/03/2006, création
* HISTORIQUE :
* HISTORIQUE :
************************************************************************
* Prière de PRENDRE LE TEMPS de compléter les commentaires
* en cas de modification de ce sous-programme afin de faciliter
* la maintenance !
************************************************************************
*
*
'DEBPROC' GDIV ;
'ARGUMENT'     _mt*'MAILLAGE' ;
'ARGUMENT'   gdisc*'MOT     ' ;
'ARGUMENT'   discv*'MOT     ' ;
'ARGUMENT'   discp*'MOT     ' ;
'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 ;
         'ARGUMENT' discc*'MOT     ' ;
      'FINSI' ;                  
   'SINON' ;
      discc = 'CSTE' ;
   'FINSI' ;            
'ARGUMENT' methgau/'MOT     ' ;
   'SI' ('NON' ('EXISTE' methgau)) ;
      methgau = 'GAU7' ;
   'FINSI' ;      
*
   vdim = 'VALEUR' 'DIME' ;
   vmod = 'VALEUR' 'MODE' ;
   idim = 0 ;
   lpp = 'MOTS' 'LX'      ; ldp = 'MOTS' 'FLX' ;   
   'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'PLANDEFO')) ;
      lpv = 'MOTS' 'UX' 'UY' ; ldv = 'MOTS' 'FX' 'FY' ;
      idim = 2 ;
      iaxi = FAUX ;
   'FINSI' ;
   'SI' ('ET' ('EGA' vdim 2) ('EGA' vmod 'AXIS')) ;
      lpv = 'MOTS' 'UR' 'UZ' ; ldv = 'MOTS' 'FR' 'FZ' ;
      idim = 2 ;
      iaxi = VRAI ;
   'FINSI' ;
   'SI' ('ET' ('EGA' vdim 3) ('EGA' vmod 'TRID')) ;
      lpv = 'MOTS' 'UX' 'UY' 'UZ' ; ldv = 'MOTS' 'FX' 'FY' 'FZ' ;
      idim = 3 ;
      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 ;
   'FINSI' ;      
*   
   numop  = 1 ;
   numder = idim ;
   mmp = 'MOTS' nomp ;
   numvar = idim ;
   'SI' iaxi ;
      numdat = 3 ;
      numcof = 3 ;
   'SINON' ;      
      numdat = 1 ;
      numcof = 1 ;
   'FINSI' ;      
*
   A = ININLIN numop numvar numdat numcof numder ;   
   'REPETER' iidim idim ;
      A . 'VAR' . &iidim . 'NOMDDL' = 'MOTS' ('EXTRAIRE' lpv &iidim) ;
      A . 'VAR' . &iidim . 'DISC'   = discv ;
   'FIN' iidim ;
   A . 'DAT' . 1 . 'NOMDDL' = 'MOTS' 'SCAL' ;
   A . 'DAT' . 1 . 'DISC'   = discc ;
   A . 'DAT' . 1 . 'VALEUR' = coef ;
   A . 'COF' . 1 . 'COMPOR' = 'IDEN' ;
   A . 'COF' . 1 . 'LDAT'   = 'LECT' 1 ;
   'SI' iaxi ;
      A . 'DAT' . 2 . 'NOMDDL' = 'MOTS' 'SCAL' ;
      A . 'DAT' . 2 . 'DISC'   = 'CSTE' ;
      A . 'DAT' . 2 . 'VALEUR' = dp ;
      A . 'COF' . 2 . 'COMPOR' = 'IDEN' ;
      A . 'COF' . 2 . 'LDAT'   = 'LECT' 2 ;
      A . 'DAT' . 3 . 'NOMDDL' = 'MOTS' 'SCAL' ;
      A . 'DAT' . 3 . 'DISC'   = gdisc ;
      A . 'DAT' . 3 . 'VALEUR' = rmt ;
      A . 'COF' . 3 . 'COMPOR' = 'IDEN' ;
      A . 'COF' . 3 . 'LDAT'   = 'LECT' 3 ;
   'FINSI' ;
*
   'SI' iaxi ;
      'REPETER' iidim idim ;
         A . 1 . &iidim . &iidim  = 'LECT' 1 2 3 ;
      'FIN' iidim ;
      A . 1 . 1 . 0 = 'LECT' 1 2 ;
   'SINON' ;
      'REPETER' iidim idim ;
         A . 1 . &iidim . &iidim  = 'LECT' 1 ;
      'FIN' iidim ;
   'FINSI' ;
*
   numvar = 1 ;
   numdat = 0 ;
   numcof = 0 ;
   B = ININLIN numop numvar numdat numcof numder ;   
   B . 'VAR' . 1 . 'NOMDDL' = ldp ;
   B . 'VAR' . 1 . 'DISC'   = discp ;
   B . 1 . 1 . 0 = 'LECT' ;
*
   mgdiv = 'NLIN' gdisc _mt A B methgau ;
*
'RESPRO' mgdiv ;
'FINPROC' ;
*
* End of procedure file GDIV
*
*ENDPROCEDUR gdiv
*BEGINPROCEDUR gmass
************************************************************************
* NOM         : GMASS
* 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' GMASS ;
'ARGUMENT'     _mt*'MAILLAGE' ;
'ARGUMENT'   gdisc*'MOT     ' ;
'ARGUMENT'    nomt*'MOT     ' ;
'ARGUMENT'   disct*'MOT     ' ;
'ARGUMENT'    nomq*'MOT     ' ;
'ARGUMENT'   discq*'MOT     ' ;
'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 ;
         'ARGUMENT' discc*'MOT     ' ;
      'FINSI' ;                  
   'SINON' ;
      discc = 'CSTE' ;
   'FINSI' ;
'ARGUMENT' methgau/'MOT     ' ;
   'SI' ('NON' ('EXISTE' methgau)) ;
      methgau = 'GAU7' ;
   'FINSI' ;
'ARGUMENT' chpop/'CHPOINT' ;
'ARGUMENT' chpod/'CHPOINT' ;
*
   vdim = 'VALEUR' 'DIME' ;
   vmod = 'VALEUR' 'MODE' ;
   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 ;
      dprmt = '*' ('COORDONNEE' 1 _mt) ('*' PI 2.D0) ;
   'FINSI' ;      
   numop  = 1 ;
   numder = idim ;
   mmt = 'MOTS' nomt ;
   mmq = 'MOTS' nomq ;
   numvar = 1 ;
   numdat = 1 ;
   numcof = 1 ;
*
   A = ININLIN numop numvar numdat numcof numder ;   
   A . 'VAR' . 1 . 'NOMDDL' = mmt ;
   A . 'VAR' . 1 . 'DISC'   = disct ;
   'SI' ('EXISTE' chpop) ;
      A . 'VAR' . 1 . 'VALEUR'   = chpop ;
   'FINSI' ;   
   A . 'DAT' . 1 . 'NOMDDL' = 'MOTS' 'SCAL' ;
   A . 'DAT' . 1 . 'DISC'   = discc ;
   A . 'DAT' . 1 . 'VALEUR' = coef ;
   A . 'COF' . 1 . 'COMPOR' = 'IDEN' ;
   A . 'COF' . 1 . 'LDAT'   = 'LECT' 1 ;
*
   A . 1 . 1 . 0 = 'LECT' 1 ;
*
   'SI' iaxi ;
      numdat = 1 ;
      numcof = 1 ;
   'SINON' ;      
      numdat = 0 ;
      numcof = 0 ;
   'FINSI' ;      
   B = ININLIN numop numvar numdat numcof numder ;   
   B . 'VAR' . 1 . 'NOMDDL' = mmq ;
   B . 'VAR' . 1 . 'DISC'   = discq ;
   'SI' ('EXISTE' chpod) ;
      B . 'VAR' . 1 . 'VALEUR'   = chpod ;
   'FINSI' ;   
*
   'SI' iaxi ;
      B . 'DAT' . 1 . 'NOMDDL' = 'MOTS' 'SCAL' ;
      B . 'DAT' . 1 . 'DISC'   = gdisc ;
      B . 'DAT' . 1 . 'VALEUR' = dprmt ;
      B . 'COF' . 1 . 'COMPOR' = 'IDEN' ;
      B . 'COF' . 1 . 'LDAT'   = 'LECT' 1 ;
   'FINSI' ;
   'SI' iaxi ;      
      B . 1 . 1 . 0 = 'LECT' 1 ;
   'SINON' ;      
      B . 1 . 1 . 0 = 'LECT' ;
   'FINSI' ;      
*
    mgmass = 'NLIN' gdisc _mt A B methgau ;
*
'RESPRO' mgmass ;
'FINPROC' ;
*
* End of procedure file GMASS
*
*ENDPROCEDUR gmass
*
*
************************************************************************
* NOM         : ERRREL
* DESCRIPTION : erreur relative entre 2 chpoints
*
'DEBPROC' ERRREL ;
'ARGUMENT' ch*'CHPOINT' ;
'ARGUMENT' chref*'CHPOINT' ;
*
val = 'MAXIMUM' ('RESULT' ('ABS' ('-' ch chref))) ;
valref = 'MAXIMUM' ('RESULT' ('ABS' chref)) ;
*
'SI' ('<' ('ABS' valref) 1.D-10) ;
   echref = 1.D0 ;
'SINON' ;
   echref = valref ;   
'FINSI' ;
*
errabs = '/' val echref ;
*
'RESPRO' errabs ;
*
* End of procedure file ERRREL
*
'FINPROC' ;
*
*
'OPTION' 'DIME' 2 'ELEM' QUA8  ;
*
* Maillage quelconque
*
pA = 0. 0. ; pB = 1. 0. ; pC = 1. 1. ; pD = 0. 1. ;
l1 = pA 'DROIT' 2 pB ;
l2 = pB 'DROIT' 4 pC ;
l3 = pC 'DROIT' 3 pD ;
l4 = pD 'DROIT' 5 pA ;
mt = 'SURFACE' (l1 'ET' l2 'ET' l3 'ET' l4) ;
_mt = 'CHANGER' mt 'QUAF' ;
disct = 'LINE' ;
$mt = 'MODELISER' _mt 'NAVIER_STOKES' disct ;
mt = 'DOMA' $mt 'MAILLAGE' ;
*
*
* Construction d'une matrice de masse
*
rv = 'EQEX' 'OPTI' 'EF' 'IMPL' 'CENTREE'
            'ZONE' $mt 'OPER' 'DFDT' 1.4 'T' 1. 'INCO' 'T' ;
rv . 'INCO' = 'TABLE' 'INCO' ;
rv . 'INCO' . 'T' = 'KCHT' $mt 'SCAL' 'SOMMET' 0.D0 ;
dummy mmassk = 'DFDT' (rv . '1DFDT') ;
*
* Autres façons
*
mmass   = gmass _mt 'LINE' 'T' disct 'T' disct 1.4 ;
mmassk2 = 'KOPS' 'RIMA' mmass ;
mmass2  = 'KOPS' 'RIMA' mmassk ;
mmass3  = 'KOPS' 'RIMA' mmassk2 ;
mmassk3 = 'KOPS' 'RIMA' mmass2 ;
*
tmass = 'TABLE' ;
tmass . 1 = mmass ;
tmass . 2 = mmassk ;
tmass . 3 = mmass2 ;
tmass . 4 = mmassk2 ;
tmass . 5 = mmass3 ;
tmass . 6 = mmassk3 ;
*
cq = 'NOMC' 'T' ('BRUIT' 'BLAN' 'UNIF' 0.6 0.7 mt) ;
*
dmass = 'DIME' tmass ;
tchpo = 'TABLE' ;
'REPETER' imass dmass ;
   tchpo . &imass = '*' (tmass . &imass) cq ;
'FIN' imass ;
ok1 = vrai ;
'REPETER' imass ('-' dmass 1) ;
   err = ERRREL (tchpo . &imass) (tchpo . (&imass '+' 1)) ;
   'MESSAGE' ('CHAINE' 'imass=' &imass ' err=' err) ;
   ok1 = 'ET' ok1 ('<' err 1.D-12) ;
'FIN' imass ;
'LISTE' ok1 ;
*
* Construction d'une matrice de divergence
*
rv = 'EQEX' 'OPTI' 'EF' 'IMPL' 'CENTREE' 'CENTRE'
            'ZONE' $mt 'OPER' 'KMAB' 1.4 'INCO' 'UN' 'PN' ;
rv . 'INCO' = 'TABLE' 'INCO' ;
rv . 'INCO' . 'UN' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
rv . 'INCO' . 'PN' = 'KCHT' $mt 'SCAL' 'CENTRE' 0.D0 ;
dummy mdivk = 'KMAB' (rv . '1KMAB') ;
*
* Autres façons
*
mdiv   = gdiv _mt 'LINE' 'LINE' 'CSTE' 1.4 ;
mdiv = 'CHANGER' 'INCO' mdiv ('MOTS' 'UX' 'UY' 'LX')
                             ('MOTS' '1UN' '2UN' 'PN')
                             ('MOTS' 'FX' 'FY' 'FLX')
                             ('MOTS' '1UN' '2UN' 'PN')
                             'MULT' ;                             
mdivk2 = 'KOPS' 'RIMA' mdiv ;
mdiv2  = 'KOPS' 'RIMA' mdivk ;
mdiv3  = 'KOPS' 'RIMA' mdivk2 ;
mdivk3 = 'KOPS' 'RIMA' mdiv2 ;
*
tdiv = 'TABLE' ;
tdiv . 1 = mdiv ;
tdiv . 2 = mdivk ;
tdiv . 3 = mdiv2 ;
tdiv . 4 = mdivk2 ;
tdiv . 5 = mdiv3 ;
tdiv . 6 = mdivk3 ;
*
c1 = 'NOMC' '1UN' ('BRUIT' 'BLAN' 'UNIF' 0.6 0.7 mt) ;
c2 = 'NOMC' '2UN' ('BRUIT' 'BLAN' 'UNIF' 0.6 0.7 mt) ;
cq = c1 '+' c2 ;
*
ddiv = 'DIME' tdiv ;
tchpo = 'TABLE' ;
'REPETER' idiv ddiv ;
   tchpo . &idiv = '*' (tdiv . &idiv) cq ;
'FIN' idiv ;
ok2 = vrai ;
'REPETER' idiv ('-' ddiv 1) ;
   err = ERRREL (tchpo . &idiv) (tchpo . (&idiv '+' 1)) ;
   'MESSAGE' ('CHAINE' 'idiv=' &idiv ' err=' err) ;
   ok2 = 'ET' ok2 ('<' err 1.D-12) ;
'FIN' idiv ;
'LISTE' ok2 ;
*
*
* Construction d'une matrice de divergence et sa transposée
*
rv = 'EQEX' 'OPTI' 'EF' 'IMPL' 'CENTREE' 'CENTRE'
            'ZONE' $mt 'OPER' 'KBBT' -1.4 'INCO' 'UN' 'PN' ;
rv . 'INCO' = 'TABLE' 'INCO' ;
rv . 'INCO' . 'UN' = 'KCHT' $mt 'VECT' 'SOMMET' (0.D0 0.D0) ;
rv . 'INCO' . 'PN' = 'KCHT' $mt 'SCAL' 'CENTRE' 0.D0 ;
dummy mdivk = 'KBBT' (rv . '1KBBT') ;
*
* Autres façons
*
mdiv   = gdiv _mt 'LINE' 'LINE' 'CSTE' 1.4 ;
mdiv = 'CHANGER' 'INCO' mdiv ('MOTS' 'UX' 'UY' 'LX')
                             ('MOTS' '1UN' '2UN' 'PN')
                             ('MOTS' 'FX' 'FY' 'FLX')
                             ('MOTS' '1UN' '2UN' 'PN')
                             'MULT' ;
mdiv = mdiv 'ET' ('KOPS' 'TRANSPOS' mdiv) ;                             
mdivk2 = 'KOPS' 'RIMA' mdiv ;
mdiv2  = 'KOPS' 'RIMA' mdivk ;
mdiv3  = 'KOPS' 'RIMA' mdivk2 ;
mdivk3 = 'KOPS' 'RIMA' mdiv2 ;
*
tdiv = 'TABLE' ;
tdiv . 1 = mdiv ;
* On ne met pas la suivante car le produit ne prend pas en compte
* la transposée (par contre, KOPS RIMA, oui)
*tdiv . 6 = mdivk ;
tdiv . 2 = mdiv2 ;
tdiv . 3 = mdivk2 ;
tdiv . 4 = mdiv3 ;
tdiv . 5 = mdivk3 ;
*
c1 = 'NOMC' '1UN' ('BRUIT' 'BLAN' 'UNIF' 0.6 0.7 mt) ;
c2 = 'NOMC' '2UN' ('BRUIT' 'BLAN' 'UNIF' 0.6 0.7 mt) ;
c3 = 'NOMC' 'PN' ('BRUIT' 'BLAN' 'UNIF' 0.6 0.7 ('DOMA' $mt 'CENTRE')) ;
cq = c1 '+' c2 '+' c3 ;
*
ddiv = 'DIME' tdiv ;
tchpo = 'TABLE' ;
'REPETER' idiv ddiv ;
   tchpo . &idiv = '*' (tdiv . &idiv) cq ;
'FIN' idiv ;
ok3 = vrai ;
'REPETER' idiv ('-' ddiv 1) ;
   err = ERRREL (tchpo . &idiv) (tchpo . (&idiv '+' 1)) ;
   'MESSAGE' ('CHAINE' 'idiv=' &idiv ' err=' err) ;
   ok3 = 'ET' ok3 ('<' err 1.D-12) ;
'FIN' idiv ;
'LISTE' ok3 ;
*
'MESSAGE' ('CHAINE' 'ok1 = ' ok1) ;
'MESSAGE' ('CHAINE' 'ok2 = ' ok2) ;
'MESSAGE' ('CHAINE' 'ok3 = ' ok3) ;
*
'SI' interact ;
   'OPTION' 'DONN' 5 ;
'FINSI' ;
'SI' ('NON' (ok1 'ET' ok2 'ET' ok3)) ;
   'ERREUR' 5 ;
'SINON' ;
   'MESSAGE' 'Tout sest bien passe' ;   
'FINSI' ;    
*
* End of dgibi file KOPS_RIMA
*
'FIN' ;

 

 

 

 

