Download latw.dgibi

Back to the list

* fichier :  latw.dgibi
*$$$$ EXEC
* EXEC      PROCEDUR  MAGN      03/03/31    21:15:04     4631           
*X EXEC (Procedure)
*   Procedure EXEC
*
*   Objet   :  Execute un algorithme décrit dans une table RV
*              de type EQEX.
*              Cette table est créée par l'opérateur EQEX
*
*   Syntaxe :  EXEC RV ;
*
***********************************************************************
* VERSION    : ????
* HISTORIQUE : 20/12/99: gounand
* Rajout de la gestion de la matrice servant à l'assemblage
* (rv . 'METHINV' . 'MATASS') 
*
* HISTORIQUE : 10/11/00: magnaud
* Reecriture de exec pour tirer parti du // (operateur ASSI et RESO)
* Pour l'instant cette procedure est testee experimentalement dans
* la directive EQUA de EXEC
*
* HISTORIQUE : 04/04/01: magnaud
* Calcul et impression tout les FIDT cycles de la norme Linf du residu
*
* HISTORIQUE :
* HISTORIQUE :
************************************************************************
* DISCPRES = (d'apres KMIC)
* KPRE=3 pression P0   KPRE=4 pression P1  KPRE=2 cas macro 1ère génération
* KPRE=5 pression MSOMMET
************************************************************************
'DEBPROC'  EXEC ;
'ARGUMENT' rv*'TABLE   ' ;

* Logique pilotant le recalcul de la matrice de pression
 CALPRE=FAUX                                                   ;
 Si ('EXIST' rv 'CALPRE')                                      ;
  vertytab rv 'CALPRE' 'LOGIQUE'                               ;
  CALPRE=rv.'CALPRE'                                           ;
 Finsi                                                         ;

 Si(NON('EXIST' rv 'XEQUA'));
 rv.'XEQUA'= FAUX ;
 Finsi ;

********************************************************************************
********************************************************************************
****** Directive EQUA **********************************************************
********************************************************************************
********************************************************************************

 Si (rv.'XEQUA');

    IMPKRES=0 ;
  Si ('EXIST' rv 'NUMASSI'); numassi=rv.'NUMASSI';
  Sinon;                     numassi=1     ;
  Finsi;


  Xdfdt  = FAUX ;

  ITMA=rv . 'ITMA';
 'SI' ('<EG' ITMA 1) ;
  ITMA=1 ;
 'FINSI'  ;

  NITER=rv . 'NITER';
 'SI' ('<EG' NITER 1) ;
  NITER=1 ;
 'FINSI'  ;

  OMEGA=rv . 'OMEGA';
 'SI' ('<EG' NITER 1) ;
  OMEGA=1.;
 'FINSI'  ;

 NUPDT=rv.'PASDETPS'.'NUPASDT';

 'SI'((NON (rv.'TRAN')) et ('>' ITMA 1) );
 Mess ' Incoherence : Algorithme Permanent et ITMA >1';
 QUITTER EXEC ;
 'FINSI' ;

 'SI'((rv.'TRAN') et (NON (rv.'PROJ')) et ('EGA' NUPDT 1));
 Mess ' Algorithme transitoire standard implicite ou explicite ';
 mess '========================================================';
 'FINSI' ;

 'SI'((rv.'PROJ') et ('EGA' NUPDT 1));
  mess 'Algorithme de Projection';
  mess '========================';
 'FINSI' ;

  'SI' ( non (rv.'TRAN'));
  mess 'Algorithme de recherche d un permanent ';
  mess '=======================================';
 'FINSI' ;


'REPETER' BCLTPS ITMA ;
  si (rv.'PROJ');
   testp1 = non ( exist rv 'MATC') ;
  sinon ;
   testp1 = FAUX  ;
  finsi ;
 'REPETER' BCLINT NITER ;
 Si (non (rv.'TRAN'));
   mess 'ITERATION ' &BCLINT;
 Finsi ;

  Si (rv.'XRIG');
   MRIG='RGDT    ';
   sf mau  = assi numassi 'KOPS' 'RIGIDITE' ;
   sp map  = assi numassi 'KOPS' 'RIGIDITE' ;
   sr mar  = assi numassi 'KOPS' 'RIGIDITE' ;
  Sinon ;
   MRIG=TEXT '    ';
   sf mau  = assi numassi 'KOPS' 'MATRIK' ;
   sp map  = assi numassi 'KOPS' 'MATRIK' ;
   sr mar  = assi numassi 'KOPS' 'MATRIK' ;
  Finsi ;

  NRES=0    ;

*****************************************************
*  ._._.                  \|/
*  ._._.   CALCUL MATRICES ELEMENTAIRES
*  ._._.                  /|\
*****************************************************


   'REPETER' bloc2 ('DIME' (rv . 'LISTOPER')) ;
      nomper = 'EXTRAIRE' &bloc2 (rv . 'LISTOPER') ;
*     mess ' Début BLOC2 nomper=' nomper ;
      notable= 'MOT' ('TEXTE' ('CHAINE' &bloc2 nomper)) ;
       Si('>EG' (rv.'IMPR') 2); mess 'Operateur ' nomper ; Finsi ;
      td=rv.notable ;
      tdk=td.'KOPT' ;
      iarg= rv.notable.'IARG' ;
   arg1 = TEXT '   ' ; arg2 = TEXT '   ' ; arg3 = TEXT '   ' ;
   arg4 = TEXT '   ' ; arg5 = TEXT '   ' ; arg6 = TEXT '   ' ;
   arg7 = TEXT '   ' ; arg8 = TEXT '   ' ; arg9 = TEXT '   ' ;

   Si ('>EG' iarg 1 );
      Si ( EGA ('TYPE' (td.'ARG1')) 'MOT     ' ) ;
      arg1=rv.'INCO'.(td.'ARG1') ;
      Sinon ;
      arg1=(td.'ARG1') ;
      Finsi ;
   Finsi ;

   Si ('>EG' iarg 2 );
      Si ( EGA ('TYPE' (td.'ARG2')) 'MOT     ' ) ;
      arg2=rv.'INCO'.(td.'ARG2') ;
      Sinon ;
      arg2=(td.'ARG2') ;
      Finsi ;
   Finsi ;

   Si ('>EG' iarg 3 );
      Si ( EGA ('TYPE' (td.'ARG3')) 'MOT     ' ) ;
      arg3=rv.'INCO'.(td.'ARG3') ;
      Sinon ;
      arg3=(td.'ARG3') ;
      Finsi ;
   Finsi ;

   Si ('>EG' iarg 4 );
      Si ( EGA ('TYPE' (td.'ARG4')) 'MOT     ' ) ;
      arg4=rv.'INCO'.(td.'ARG4') ;
      Sinon ;
      arg4=(td.'ARG4') ;
      Finsi ;
   Finsi ;

* Traitement du cas transitoire
   XTRA =CHAI 'PERM' ; DT   = TEXT '   ' ;  SCHE=TEXT '   ' ;
   inc1 = TEXT '   ' ; inc2 = TEXT '   ' ;
   imc1 = TEXT '   ' ; imc2 = TEXT '   ' ;
   BETAT= TEXT '   ' ;
   XBDF2 = FAUX ;

   XOT=(('EGA' nomper 'NS      ') ou ('EGA' nomper 'TSCA    ')
     ou ('EGA' nomper 'DFDT    ') ou ('EGA' nomper 'TSCAL   '));

   Si (rv.'PROJ' et ('EGA' nomper 'KBBT    ')) ;
    XTRA=CHAI 'PROJ' ;
   Finsi ;

   Si (rv.'TRAN') ;
     Xdfdt  = VRAI ;
     XTRA=CHAI 'TRANS' ;
     Si (rv.'PROJ') ; XTRA=CHAI 'PROJ' ; Finsi ;
     DT=(rv.'DELTAT') ;
     Si ( EGA ('TYPE' DT) 'MOT     ' ) ;
       DT=rv.'INCO'.DT ;
     Finsi ;
     SCHE = rv.'SCHEMAT';
     Si (EGA SCHE 'SEMI');
       BETAT=(rv.'Betat') ;
     Finsi ;
     Si (EGA SCHE 'BDF2');
       XBDF2 = VRAI ;
     Finsi ;
   Finsi ;

     nbic=dime td.'LISTINCO';

     Si ('>EG' nbic 1 );
       ninc1=extr td.'NUMEINCO' 1 ;
       a= chai 'FORMAT' '(A3,I1)' 'INC' ninc1 ;
       inc1=rv.'INCO'.(rv.a);
         Si (XBDF2) ;
          a= chai 'FORMAT' '(A3,I1)' 'IMC' ninc1 ;
          imc1=rv.'INCO'.(rv.a);
         Finsi;
     Finsi ;

     Si ('>EG' nbic 2 );
       ninc2=extr td.'NUMEINCO' 2 ;
       a= chai 'FORMAT' '(A3,I1)' 'INC' ninc2 ;
       inc2=rv.'INCO'.(rv.a);
         Si (XBDF2) ;
          a= chai 'FORMAT' '(A3,I1)' 'IMC' ninc2 ;
          imc2=rv.'INCO'.(rv.a);
         Finsi;
     Finsi ;


   MM=TEXT '    ';
   DCEN='????' ;
   Si(EGA (tdk.'MTRMASS') 2 );MM='MMDIAGO';Finsi;
   Si(EGA (tdk.'IDCEN') 1 );DCEN='CENTREE';Finsi;
   Si(EGA (tdk.'IDCEN') 2 );DCEN='SUPGDC ';Finsi;
   Si(EGA (tdk.'IDCEN') 3 );DCEN='SUPG   ';Finsi;
   Si(EGA (tdk.'IKOMP') 0 );MC=TEXT '    ';Finsi;
   Si(EGA (tdk.'IKOMP') 1 );MC='CONS';Finsi;

   INEFMD= tdk.'INEFMD' ;
   tdz=TEXT '   '  ;
   Si (EGA nomper 'VNIMP   ');
   tdz=CHAI 'V' ;
   nomper= text 'NS';
   Finsi ;

* temp place ;
* mess ' Avant ' nomper  ' tdz ' tdz ' DT=' DT ' XTRA=' ; list xtra ;
* mess SCHE ; mess BETAT;
   msi mai =assi  numassi  nomper tdz
     (td.'DOMZ') (td.'LISTINCO') (td.'TYPEINCO') (rv.'TYPPRESS')
     INEFMD MRIG MM 'CONS' 'STABP' (tdk.'STABP') 'CMD' (tdk.'CMD') DCEN
     XTRA DT SCHE BETAT
    'INCO' inc1 imc1 inc2 imc2
   (td.'IARG') arg1 arg2 arg3 arg4 ;
* temp place ;
* mess ' Apres ' nomper;

       Si ((rv.'PROJ') et ('EGA' nomper 'KBBT    '));
        msp =assi  numassi  msi ;
        mac =assi  numassi  mai ;
        'ITER' bloc2 ;
       Finsi ;

       Si ((rv.'PROJ') et ('EGA' nomper 'DFDT    '));
        mam =assi  numassi  mai ;
       Finsi ;

*      Si ((rv.'PROJ') et ('EGA' nomper 'TOIMP   '));
*       list msi ;
*      Finsi ;

       Si ((rv.'PROJ') et ('EGA' nomper 'NS      '));
     XTRA=CHAI 'TRANS' ;
     DT=(rv.'DELTAT') ;
     Si ( EGA ('TYPE' DT) 'MOT     ' ) ;
       DT=rv.'INCO'.DT ;
     Finsi ;
     SCHE = rv.'SCHEMAT';
     Si (EGA SCHE 'SEMI');
       BETAT=(rv.'Betat') ;
     Finsi ;
     Si (EGA SCHE 'BDF2');
       XBDF2 = VRAI ;
     Finsi ;
*       mess ' Appel DFDT DT=' DT ' XTRA=' ; list xtra ;
        msm mam =assi  numassi  DFDT
        (td.'DOMZ') (td.'LISTINCO') (td.'TYPEINCO') (rv.'TYPPRESS')
        INEFMD MRIG MM 'CONS' 'CMD' (tdk.'CMD') DCEN
        XTRA DT SCHE BETAT
       'INCO' inc1 imc1 inc2 imc2
        1 arg1 ;
        oubli msm;
       Finsi ;

    mau = assi numassi mau 'ET' mai ;
    sf  = assi numassi sf  'ET' msi ;


     rv.'TVNP'=FAUX;
     rv.'TVNPC'=FAUX;

   Si ('EGA' nomper  'VNIMP   ');                          *
   mess ' Cas oper VNIMP' ;
    Si (ega (rv.'TYPPRESS') 'MSOMMET');
     rv.'TVNPC'=VRAI;
     mvnpc=mai ;
     svnpc=msi ;
    Sinon ;
     rv.'TVNP'=VRAI ;
     mar = assi numassi mar 'ET' mai ;
     sr  = assi numassi sr  'ET' msi ;
    Finsi ;
   Sinon ;

   Finsi ;

 'FIN' bloc2 ;
*mess 'Fin Bloc2 ' ;

 'SI'((rv.'TRAN') et (NON Xdfdt));
 Mess ' Incoherence : Algorithme Transitoire '
      ' et pas d increment en temps';
 Mess ' Il manque un operateur DFDT NS ou TSCA ';
 QUITTER EXEC ;
 'FINSI' ;

 NRES=NRES+1;
*mess 'NRES=' NRES;
 TABRES=chai 'FORMAT' '(A6,I1)' 'TABRES' NRES;
 Si (NON('EXIST' rv TABRES)); rv.TABRES=TABLE ; Finsi ;
 Si (NON ('EGA' ('TYPE' rv.TABRES) 'TABLE   '));
  rv.TABRES=TABLE ;
 Finsi ;

 rv.TABRES.'mau' =mau     ;
 rv.TABRES.'sf'  =sf      ;
 rv.TABRES.'clim'=rv.'CLIM' ;
 rv.TABRES.'METHINV'=rv.'METHINV' ;

*****************************************************
*              __      |\
*   \         /_/o     | |   \|/
*    \=>      \_\/      \|  --O--  PROJECTION
*             /|\      /\    /|\
*************/*|*\***********************************

 'SI' (rv.'PROJ');
    SCHE = rv.'SCHEMAT';
    cnvi1=chai 'FORMAT' '(I1,A3)' 1 (extr rv.'LISTINCO' 1) ;
    cnvi2=chai 'FORMAT' '(I1,A3)' 2 (extr rv.'LISTINCO' 1) ;
    cnvi3=chai 'FORMAT' '(I1,A3)' 3 (extr rv.'LISTINCO' 1) ;
    cnppp=chai 'FORMAT' '(I1,A3)' 3 (extr rv.'LISTINCO' 2) ;
  'SI' (testp1) ;
    mess ' CALCUL de CMCT ' ;
    Diag = doma (rv.'MODELE') 'XXDIAGSI' ;
    Digv= (nomc Diag cnvi1) et (nomc Diag cnvi2) ;
     Si ('EGA' (VALE DIME) 3);
      Digv= Digv et (nomc Diag cnvi3);
     Finsi ;

* Diag : Matrice diagonale de base ('SCAL')
* Digv : Matrice diagonale de base ('1U' '2U' '3U')
* Digvl: Matrice diagonale contenant les conditions aux limites

    IDiag = 'INVERSE' Digv ;

   Digvl= 'KOPS' Digv 'CLIM' (rv . 'CLIM') -1;
   IDigvl= 'INVERSE' Digvl ;

*
* Calcul matrices MD-1
*
    MDM1='KMF' mam IDiag ;
     Si ('EGA' SCHE 'BDF2'); MDM1=MDM1 * (((rv.'DELTAT')*2.)/3.) ;
     Sinon ; MDM1=MDM1 * (rv.'DELTAT') ;
     Finsi ;
*
* Calcul matrices C
*
*   msp mac =assi  numassi  'KBBT'
*   (rv.'MODELE') (rv.'LISTINCO') (rv.'TYPEINCO') (rv.'TYPPRESS')
*   MRIG  (1) (1.) ;

    matpc mac  = kops 'CMCTSPLT' mac ;

     Si ('EGA' (rv.'TYPPRESS') 'MSOMMET');
      mess ' Cas des pressions continues' ;
      incp= mots (extr rv.'LISTINCO' 2) ;
      msp matpr =assi  numassi  'LAPN'
      (rv.'MODELE') incp (mots 'TEMPERAT')
      MRIG 'LINE' (1) (1.) ;

     Sinon ;
      mess ' Cas des pressions discontinues' ;

      Si (rv.'TVNPC'); mac=mac et mvnpc; Finsi;
       rv . 'MATC' = mac ;
*  list mac 4 ;
       scr mcr  = 'KOPS' 'MATRIK' ;
        Si (rv.'TVNP') ;
         rv . 'MBTR' = mar ;
         Dunit=Idigv;
         crt= kops 'CMCT' mac mar (Dunit)  ;
         ctr= kops 'CMCT' mar mac (Dunit)  ;
         rrt= kops 'CMCT' mar mar (Dunit)  ;
         mcr= mcr et crt et ctr et rrt ;
        Finsi ;

*     list mac 3 ;list IDigvl;
       matpr = kops 'CMCT' mac mac IDigvl;
*   mess 'APRES CMCT' ; list matpr 3 ;
       matpr = matpc et matpr et mcr ;

     Finsi ;

       rv.'IDigvl'= IDigvl ;
       rv.'MATP'  = matpr ;
       rv.'MATC'  = mac   ;
       rv.'MDM1'  = MDM1  ;

  'FINSI' ;

   IDigvl= rv.'IDigvl';
   matpr = rv.'MATP' ;
   mac   = rv.'MATC' ;
   MDM1  = rv.'MDM1' ;


   'SI' ('EXIST' (rv.'INCO') 'PINM1') ;
**
** mess '           t  n-1' ;
** mess 'Calcul de C  P'    ;
**

     pinm1= rv.'INCO'.'PINM1';
*   cpi2=(extr rv.'LISTINCO' 2) ;
*   pinm1= nomc (rv.'INCO'.(rv.'INC2')) cpi2;
    cpre = 'KMF' (rv . 'MATC') pinm1 'TRAN' ;
     Si (rv.'TVNP') ;
      cxre = 'KMF' (rv . 'MBTR') pinm1 'TRAN' ;
      cpre = cpre et cxre ;
     Finsi ;

     Si ('EGA' (rv.'TYPPRESS') 'MSOMMET');
      gradpres = 'KOPS' MDM1 '*' cpre ;
     Sinon ;
      gradpres = 'KOPS' MDM1 '*' cpre ;
     Finsi ;
      gradpres = nomc (mots 'UX' 'UY' 'UZ')
                   (mots cnvi1 cnvi2 cnvi3) gradpres;

      oublier cpre ;
      rv.'INCO'.'GRADPRES' = gradpres ;
      sf = sf - (rv.'INCO'.'GRADPRES') ;
      rv.'TABRES1'.'sf'=sf ;

   'FINSI' ;
    clim = exco rv.'CLIM' (mots cnvi1 cnvi2 cnvi3) 'NOID' ;
    rv.'TABRES1'.'clim'=clim ;

**********  FIN Traitement PRESSION ************************
*   mess ' FIN Traitement PRESSION' ;

 'FINSI' ;
*******************************************************


*****************************************************
*   \___\  /
*        \/                     RESOLUTION
*         \               \|/
*************************--O--***********************
    res mau  = assi numassi 'KOPS' 'MATRIK' ;
    Si (rv.XRIG);
    res = chan res 'ATTRIBUT' 'NATURE' 'DIFFUS' ;
    Finsi ;
Repeter Bclres NRES ;
*   mess ' Resolution ' NRES ;
    TABRES=rv.(chai 'FORMAT' '(A6,I1)' 'TABRES' &Bclres);
    MTIV = TABRES.'METHINV';
    mau  = TABRES.'mau' ;
    sf   = TABRES.'sf'  ;
    clim = TABRES.'clim';
*........................................................
 Si (rv.'XRIG') ;
    gclim=extr clim 'MAILLAGE' ;
    rclim=bloq 'T' gclim ;
    dclim=depi rclim (nomc 'Q' clim);
    mau = mau et rclim ;
    sf  = sf  et dclim ;
*   list mau; list sf ;
    res1 = 'RESO' mau sf ;
    res = ASSI numassi res1 et res ;
 Sinon ;
     MATASS= mau ;
     TYRENU=MTIV.'TYRENU';PCMLAG=MTIV.'PCMLAG';KTYPI =MTIV.'TYPINV';
     XINIT=TEXT '   ' ;DI2 = TEXT '   ' ;DI3 = TEXT '   ' ;
     DI4 = TEXT '   ' ;DI5 = TEXT '   ' ;
     MAPREC=TEXT '   ';KPREC =TEXT '   ';PR3 = TEXT '   ' ;
     PR4 = TEXT '   ' ;PR5 = TEXT '   ' ;
   Si (('>EG' KTYPI 2) ET ('<EG' KTYPI 5));
    XINIT mar  = assi numassi 'KOPS' 'MATRIK' ;
    DI2=MTIV.'NITMAX';DI3=MTIV.'RESID';DI4=MTIV.'BCGSBTOL';
     Si ('EGA' KTYPI 5);DI5=MTIV.'GMRESTRT';Finsi ;
    MAPREC= mau ;
    KPREC=MTIV.'PRECOND';
     Si ('EGA' KPREC 4);PR3=MTIV.'MILURELX';Finsi ;
     Si (('EGA' KPREC 5) OU ('EGA' KPREC 6));
     PR4=MTIV.'ILUTLFIL';PR5=MTIV.'ILUTDTOL';
     Finsi ;
   Finsi ;
*     list mau 3 ;
*     list sf ;
      res1 = ASSI numassi 'KRES'  'LL' mau
     'TYPI' MTIV KTYPI 'CLIM' clim 'SMBR' sf
     'IMPR' IMPKRES MATASS TYRENU PCMLAG
     XINIT DI2 DI3 DI4 DI5
     MAPREC KPREC PR3 PR4 PR5;
      res = ASSI numassi res1 et res ;
 Finsi;
*........................................................
Fin Bclres ;

   rv.inco.'Res'=res ;

 'SI' (rv.'PROJ');
**
*      mess 'RESOLUTION : ETAPE DE PROJECTION ' ;
**   _n
** C U
      cun = ('KMF' (rv . 'MATC') res)*(1./(rv.'DELTAT')) ;
      Si (rv.'TVNP');
      cxn = ('KMF' (rv . 'MBTR') res)*(1./(rv.'DELTAT')) ;
      cun = cun et cxn ;
      Finsi ;
      clim=exco (rv.'CLIM') (mots (extr rv.'LISTINCO' 2)) 'NOID';
      MTIV=rv.'METHINV2' ;

*........................................................
 Si (rv.'XRIG') ;
    gclim=extr clim 'MAILLAGE' ;
    rclim=bloq 'T' gclim ;
    dclim=depi rclim (nomc 'Q' clim);
    matpr = matpr et rclim ;
    cun   = cun   et dclim ;
    sl  = 'RESO' matpr cun ;
 Sinon ;
     MATASS= matpr ;
     TYRENU=MTIV.'TYRENU';PCMLAG=MTIV.'PCMLAG';KTYPI =MTIV.'TYPINV';
     XINIT=TEXT '   ' ;DI2 = TEXT '   ' ;DI3 = TEXT '   ' ;
     DI4 = TEXT '   ' ;DI5 = TEXT '   ' ;
     MAPREC=TEXT '   ';KPREC =TEXT '   ';PR3 = TEXT '   ' ;
     PR4 = TEXT '   ' ;PR5 = TEXT '   ' ;
   Si (('>EG' KTYPI 2) ET ('<EG' KTYPI 5));
    XINIT mar  = assi numassi 'KOPS' 'MATRIK' ;
    DI2=MTIV.'NITMAX';DI3=MTIV.'RESID';DI4=MTIV.'BCGSBTOL';
     Si ('EGA' KTYPI 5);DI5=MTIV.'GMRESTRT';Finsi ;
    MAPREC= matpr;
    KPREC=MTIV.'PRECOND';
     Si ('EGA' KPREC 4);PR3=MTIV.'MILURELX';Finsi ;
     Si (('EGA' KPREC 5) OU ('EGA' KPREC 6));
     PR4=MTIV.'ILUTLFIL';PR5=MTIV.'ILUTDTOL';
     Finsi ;
   Finsi ;
      sl = ASSI numassi 'KRES'  'LL' matpr
     'TYPI' MTIV KTYPI 'CLIM' clim 'SMBR' cun
     'IMPR' IMPKRES MATASS TYRENU PCMLAG
     XINIT DI2 DI3 DI4 DI5
     MAPREC KPREC PR3 PR4 PR5;
 Finsi;
*........................................................
      ctl = 'KMF' (rv . 'MATC') sl 'TRAN' ;
      Si(rv.'TVNP') ;
      cxl = 'KMF' (rv . 'MBTR') sl 'TRAN' ;
      ctl = ctl + cxl ;
      Finsi ;
      a=KOPS IDigvl '*' ctl ;
      au = nomc (mots 'UX' 'UY' 'UZ')(mots cnvi1 cnvi2 cnvi3) a ;
      oublier ctl ;
      res  =  res - (au*(rv.'DELTAT')) ;
 'FINSI' ;


*************************--O--***********************
*   \                     /|\
*   /\____                      RELAXATION
*  /  \   \
*****************************************************
   nbic=dime rv.'LISTINCO';
   omega=rv.'OMEGA';
   NUPDT=rv.'PASDETPS'.'NUPASDT';
   LRA= CHAI 'Pas de temps ' NUPDT ' ERREUR LINF : ' ;
     'SI' ('MULT' NUPDT (rv.'FIDT'));
       Si('EXIST' rv.'PASDETPS' 'NUPDT');
        rv.'PASDETPS'.'NUPDT'=rv.'PASDETPS'.'NUPDT' et (PROG NUPDT) ;
       Sinon ;
        rv.'PASDETPS'.'NUPDT'= (PROG NUPDT) ;
       Finsi ;
     'FINSI' ;
   Repeter Relax nbic;

    a= chai 'FORMAT' '(A3,I1)' 'INC' &relax ;

    Si (XBDF2)  ;
    b= chai 'FORMAT' '(A3,I1)' 'IMC' &relax ;
    rv.'INCO'.(rv.b)=rv.'INCO'.(rv.a);
*   mess ' On fait ' (rv.a) ' -> ' (rv.b) ;
    Finsi ;

    nc =extr rv.'LISTINCO' &relax;
    nc1=mots nc     ;
    nc2=mots 'SCAL' ;
    ty=extr rv.'TYPEINCO' &relax;
*   mess ' Composante ' nc ' Type inco ' ty ;
    Si (('EGA' ty 'VITESSE ') et ('EGA' ('VALEUR' 'DIME') 2));
    nc2=mots 'UX' 'UY' ;
    a1= chai 'FORMAT' '(I1,A3)' 1 nc ;
    a2= chai 'FORMAT' '(I1,A3)' 2 nc ;
    nc1=mots a1 a2 ;
    Finsi ;
    Si (('EGA' ty 'VITESSE ') et ('EGA' ('VALEUR' 'DIME') 3));
    nc2=mots 'UX' 'UY' 'UZ' ;
    a1= chai 'FORMAT' '(I1,A3)' 1 nc ;
    a2= chai 'FORMAT' '(I1,A3)' 2 nc ;
    a3= chai 'FORMAT' '(I1,A3)' 3 nc ;
    nc1=mots a1 a2 a3 ;
    Finsi ;
    ri= exco nc1 res nc2 'NOID';
    nbc=dime (extr ri 'COMP') ;
    Si('EGA' nbc 0);
     Si('EGA' NUPDT 1);
      Mess ' ATTENTION La (ou les) composante(s) suivantes ne sont pas'
      ' calculees' ;
      list nc1 ;
     Finsi ;
    Sinon ;
     'SI' ('MULT' NUPDT (rv.'FIDT'));
     eri=ri - rv.'INCO'.(rv.a);
     ELI=MAXI ERI 'ABS';
     ELI=(LOG (ELI + 1.0E-10))/(LOG 10.);
     LRA= CHAI LRA '  ' (rv.a) ' ' ELI ;
     ER = PROG ELI;
     ERA=CHAI 'ERLI' (rv.a);
      Si('EXIST' rv.'PASDETPS' ERA);
       rv.'PASDETPS'.ERA=rv.'PASDETPS'.ERA et ER ;
      Sinon ;
       rv.'PASDETPS'.ERA= ER ;
      Finsi ;
     'FINSI' ;

    rv.'INCO'.(rv.a)=(omega*ri) + ((1. - omega)*rv.'INCO'.(rv.a)) ;
    Finsi ;

   Fin Relax ;

     'SI' ('MULT' NUPDT (rv.'FIDT'));
      MESS LRA ;
     'FINSI' ;

 Fin BCLINT ;

*****  Avancement en temps
 rv.inco.'Resnm'=res ;
 rv.'PASDETPS'.'NUPASDT'=rv.'PASDETPS'.'NUPASDT' + 1 ;
* Algorithme de projection  P(n+1) = P(n) + (sl / dt)
    'SI' (rv.'PROJ');

    'SI' ('EXIST' (rv.'INCO') 'PINM1') ;

*      PNM1=(-1.)*rv.'INCO'.'PRESSION' ;
       PNM1=(-1.)*rv.'INCO'.(rv.'INC2') ;
       si (XBDF2) ;
       PN=PNM1 + (1.5*sl) ;
       sinon ;
       PN=PNM1 + (sl) ;
       finsi ;

*      rv.'INCO'.'PRESSION'=(-1.)*PN ;
       rv.'INCO'.(rv.'INC2')=(-1.)*PN ;
       rv.'INCO'.'PINM1'=PN ;
     'SINON' ;
*      rv.'INCO'.'PRESSION' = (-1.)*(sl) ;
       rv.'INCO'.(rv.'INC2')= (-1.)*(sl) ;
       rv.'INCO'.'PINM1'=(2.*sl);
    'FINSI' ;
    'OUBLIER' sl ;
   'FINSI' ;
*****  Avancement en temps  FIN
Fin BCLTPS ;

 QUITTER EXEC ;
 Finsi ;
********************************************************************************
********************************************************************************
****** Fin directive EQUA ******************************************************
********************************************************************************
********************************************************************************

'SI' ('EGA'  (rv . 'NAVISTOK') 0) ;
  EXAC rv ;
'QUITTER' EXEC ;
'FINSI'  ;

*******PROJ*************************************************************
*******PROJ Trois possibilités *****************************************
*******PROJ TMDM1 (vrai)_> Correction Gresho                  NON
*******PROJ TGRAD (vrai)-> Formulation Gradient               NON
*******PROJ TPNM2 (vrai)-> elimination end of step velocity   OUI
*******PROJ TMDM1 = VRAI TGRAD = FAUX TPNM2 = FAUX  ancien algo
         TYPROJ='VPI1'              ;
       'SI' ('EXIST' RV 'TYPROJ')   ;
         TYPROJ=RV.'TYPROJ'         ;
          'SI' (non (exist (MOTS 'PSCT' 'VPI1' 'VPI2') TYPROJ));
 Mess '*********************************************************' ;
 Mess ' ERREUR   ERREUR   ERREUR   ERREUR   ERREUR   ERREUR     ' ;
 Mess '                                                         ' ;
             Mess 'Le mot ' TYPROJ ' n existe pas dans la liste.';
             Mess 'Les méthodes de projection autorisées sont :';
             Mess 'VPI1 et VPI2 '                               ;
 Mess '*********************************************************' ;
             erreur 21              ;
             quitter EXEC           ;
          'FINSI'                   ;
       'FINSI'                      ;

       'SI' ('EGA' TYPROJ 'PSCT')   ;
            TGRAD = FAUX ;
            TMDM1 = FAUX ;
            TPNM2 = FAUX ;
       'FINSI'                      ;
       'SI' ('EGA' TYPROJ 'VPI1')   ;
            TGRAD = FAUX ;
            TMDM1 = VRAI ;
            TPNM2 = FAUX ;
       'FINSI'                      ;
       'SI' ('EGA' TYPROJ 'VPI2')   ;
            TGRAD = FAUX ;
            TMDM1 = FAUX ;
            TPNM2 = VRAI ;
       'FINSI'                      ;

*******PROJ Trois possibilités *****************************************
*******PROJ*************************************************************

  nomvi=rv . 'NOMVI'  ;

'SI'  ('EGA' ('VALEUR' 'DIME') 2) ;
  vnul=0.D0 0.D0 ;
  vuni=1.D0 1.D0 ;
  cnvi1= 'MOT' ('TEXTE' ('CHAINE' 1 nomvi)) ;
  cnvi2= 'MOT' ('TEXTE' ('CHAINE' 2 nomvi)) ;
  lc= mots cnvi1 cnvi2 ;
  lcu=mots 'UX' 'UY' ;
'SINON' ;
  vnul=0.D0 0.D0 0.D0 ;
  vuni=1.D0 1.D0 1.D0 ;
  cnvi1= 'MOT' ('TEXTE' ('CHAINE' 1 nomvi)) ;
  cnvi2= 'MOT' ('TEXTE' ('CHAINE' 2 nomvi)) ;
  cnvi3= 'MOT' ('TEXTE' ('CHAINE' 3 nomvi)) ;
  lc= mots cnvi1 cnvi2 cnvi3 ;
  lcu=mots 'UX' 'UY' 'UZ' ;
'FINSI' ;
'SI' ('NON' ('EXISTE' rv 'OMEGA')) ;
  omeg=1.D0 ;
'SINON' ;
  omeg=rv . 'OMEGA' ;  
'FINSI' ;

testpr ='EXISTE' rv 'PRESSION' ;
testprj ='EXISTE' rv 'PROJ' ;
testran=testpr 'ET' ('EXISTE' rv 'CO') ;

  si testpr ;  rvp  = rv.'PRESSION' ;
  achp  matpr= 'KOPS' 'MATRIK' ;
  rvp.'MATP'= matpr;
  finsi ;
  si testprj;  rvp  = rv.'PROJ' ; Finsi ;

  'SI' (rv.'IMPR' >EG 1) ;
  si testpr ;
  mess 'Algorithme semi explicite (ANCIEN)'; 
  mess '==================================';
  Finsi ;
  si testprj;
  mess 'Algorithme de Projection';
  mess '========================';
  finsi ;
  si ( non (testpr ou testprj)) ;
  mess 'Algorithme standard implicite ou explicite ';
  mess '===========================================';
  finsi ;
  'FINSI' ;

'SI' ('NON' ('EXISTE' rv 'HIST')) ;
  rv . 'HIST' = 'TABLE' ;
'FINSI' ;


ITMA=(rv . 'ITMA') ;
IMPTCRR=0 ;
IMPKRES=0 ;
'SI' ('<EG' ITMA 1) ;
  ITMA=1 ;
  IMPTCRR=1 ;
'FINSI'  ;
 Si (testprj ) ; IMPTCRR=1         ;  finsi ;
 Si ( non (testpr ou testprj)) ; IMPTCRR=1 ; finsi ;


* Gestion de la matrice de préconditionnement
*
* calass  : doit-on recalculer l'assemblage
* calprec : doit-on recalculer le préconditionneur
* calassp : idem pour la matrice de pression
* calprecp: idem pour la matrice de pression
* fcprect : fréquence de recalcul du préc. en fn du pas de temps
* fcpreci : fréquence de recalcul du préc. dans la boucle
*           d'itérations internes pour les non-linéarités
* resmn : le résidu au pas de temps ou à l'itération interne précédente
*
calprec = VRAI ;
fcprect = rv. 'METHINV' . 'FCPRECT' ;
fcpreci = rv. 'METHINV' . 'FCPRECI' ;
resmn maprec = 'KOPS' 'MATRIK' ;
resmn1 maprec1 = 'KOPS' 'MATRIK' ;
resmn2 maprec2 = 'KOPS' 'MATRIK' ;
'SI'(exist rv 'resmn');resmn=rv.'resmn' ; finsi ;
'SI'(non (exist rv 'calprec'));rv.'calprec'=VRAI;finsi;
'SI'(non (exist rv 'calass' ));rv.'calass' =VRAI;calass =VRAI;finsi;
'REPETER' bloc1 ITMA ;
* mess ' DEBUT BLOC1 ';

   testp1 = FAUX  ;
  si (testpr ou testprj) ;
   Si CALPRE  ; testp1=VRAI ; Finsi ;
   Si (non (exist rvp 'MATC')) ; testp1=VRAI ; Finsi ;
  finsi ;

  'SI' ('MULT' (&bloc1 '+' 1) fcprect) ;
    rv.'calprec' = VRAI ;
  'FINSI' ;
  'REPETER' bloci (rv . 'NITER') ;
    'SI' ('MULT' (&bloci '+' 1) fcpreci) ;
    rv.'calprec' = VRAI ;
    'FINSI' ;

  'SI' (testprj) ;
    calprecp=VRAI ;
    calassp =VRAI ;
    si (exist rvp 'calprecp' ) ; calprecp=rvp.'calprecp';
    maprec1=rvp.'maprec1' ;finsi ;
    si (exist rvp 'calassp' ) ; calassp=rvp.'calassp';
    matass1=rvp.'matass1' ;finsi ;
    fcprectp = rvp . 'METHINV' . 'FCPRECT' ;
    'SI' ('MULT' (&bloc1 '+' 1) fcprectp) ;
    calprecp= VRAI ;
    'FINSI' ;
  'FINSI' ;



    st mat  = 'KOPS' 'MATRIK' ;
    sf mau  = 'KOPS' 'MATRIK' ;


      mdfdt = 0 ;
    'REPETER' bloc2 ('DIME' (rv . 'LISTOPER')) ;
      nomper = 'EXTRAIRE' &bloc2 (rv . 'LISTOPER') ;
      notable= 'MOT' ('TEXTE' ('CHAINE' &bloc2 nomper)) ;
*     mess 'Operateur Bloc2 mdfdt ? ' nomper ;
      mdfdt = mdfdt + rv. notable . 'KOPT' . 'KFORM' ;

      si (ega nomper 'DFDT    ');
      ISCHT= (rv . notable.kopt.'ISCHT') ;
      msi mai=('TEXTE' nomper) (rv . notable) ;
      mat = mat 'ET' mai ;
      st  = st  'ET' msi ;

      sinon ;

*     mess ' 1OPER =' nomper;
      msi mai=('TEXTE' nomper) (rv . notable) ;
      mau = mau 'ET' mai ;
      sf  = sf  'ET' msi ;

      finsi ;

    'FIN' bloc2 ;

      s2 = sf et st ;
      ma1 = mau 'ET' mat ;

**********  Traitement PRESSION ****************************
*mess 'Traitement PRESSION';

'SI' (exist rv 'rvpd') ;
  rvpd = rv.'rvpd' ;
  IDigv=rv.'IDigv';
   Digv=rv.'Digv';
  matpr= rvp.'MATP' ;
'FINSI' ;

*/1    CALCUL de CMCT  pour PRESSION
'SI' (testpr et testp1) ;

  rvpd = (rvp.'DOMAINE') ;
  Diago = doma rvpd 'XXDIAGSI' ;
  si ( ega ('VALEUR' 'DIME') 2) ;
  Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) ;
  sinon ;
  Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) et
        ( exco Diago 'SCAL' cnvi3 ) ;
  finsi ;
  Digv = kcht rvpd vect sommet comp lc Digv ;

    'SI' ('EXISTE' rv 'CLIM') ;
    rvp . 'CLIM' = rv . 'CLIM' ;
    Digv = 'KOPS' Digv 'CLIM' (rv . 'CLIM') -1;
    'FINSI' ;

  IDigv= 'INVERSE' digv ;

    'SI' ('NON' ('EXISTE' rvp 'DIAGV')) ;
    rvp . 'DIAGV' = digv ;
    'FINSI' ;

  rvp . 'MATC' = 'KMAB' rvp ;
  rvp . 'PRESSION' = 'KCHT' rvpd 'SCAL'
                     'CENTRE' 0.D0 ;
  rvp . 'GRADP'    = 'KCHT' rvpd 'VECT'
                     'SOMMET' vnul ;

  achp  matpr= 'KOPS' 'MATRIK' ;
  rvp . 'MATP' = matpr ;
  rv.'rvpd'=rvpd;
  rv.'IDigv'=IDigv;
  rv.'Digv'=Digv;

'FINSI' ;

*/3   CALCUL de CMCT  pour PROJ
'SI' (testprj et testp1) ;

    Diago mma = 'KOPS' 'MATRIK' ;

      idfdt = 0 ;
    'REPETER' blocj ('DIME' (rv . 'LISTOPER')) ;
      nomper = 'EXTRAIRE' &blocj (rv . 'LISTOPER') ;
      notable= 'MOT' ('TEXTE' ('CHAINE' &blocj nomper)) ;
*?    mess 'Operateur ' nomper ;
      si (ega nomper 'DFDT    ');
      idfdt=idfdt + 1 ;
      Diago = Diago et (doma (rv. notable . 'DOMZ') 'XXDIAGSI') ;
      rvpd=rv. notable . 'DOMZ';
      finsi ;
    'FIN' blocj ;
    si (ega idfdt 0) ; mess ' Pas de DFDT ?? ' ; erreur 21 ; finsi ;

  si ( ega ('VALEUR' 'DIME') 2) ;
  Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) ;
  sinon ;
  Digv= ( exco Diago 'SCAL' cnvi1 ) et ( exco Diago 'SCAL' cnvi2 ) et
        ( exco Diago 'SCAL' cnvi3 ) ;
  finsi ;
  Digv = kcht rvpd vect sommet comp lc Digv  ;
* Matrice diagonale ne contenant pas les conditions aux limites : Diag
     Diag  = copier Digv;
     IDiag = 'INVERSE' Diag ;

  Digv = 'KOPS' Digv 'CLIM' (rv . 'CLIM') -1;

  IDigv= 'INVERSE' digv ;

    'SI' ('NON' ('EXISTE' rvp 'DIAGV')) ;
    rvp . 'DIAGV' = digv ;
    'FINSI' ;

  rvp.'INCO'=rv.'INCO' ;

    sp map  = 'KOPS' 'MATRIK' ;
    sr mar  = 'KOPS' 'MATRIK' ;
    svnpc mvnpc = 'KOPS' 'MATRIK' ;
    'REPETER' blocpj ('DIME' (rvp . 'LISTOPER')) ;
      nomper = 'EXTRAIRE' &blocpj (rvp . 'LISTOPER') ;
      notable= 'MOT' ('TEXTE' ('CHAINE' &blocpj nomper)) ;
    mess 'Procedure PROJ Operateur : ' nomper ;

      si (EGA nomper 'KBBT');
      rvp . notable . 'KOPT' . 'IKOMP' = 1 ;
      finsi ;

      msi mai=('TEXTE' nomper) (rvp . notable) ;

*******PROJ*************************************************************
*******PROJ TGRAD  calcul maig  (Formulation en Gradient)       DEBUT*** *******
  Si TGRAD ;
    mess 'Procedure PROJCT (Gradient) Operateur : ' nomper ;
      rvp . notable . 'KOPT' . 'IKOMP' = 0 ;
      msig maig=('TEXTE' nomper) (rvp . notable) ;
  Finsi ;
*******PROJ                                             -> MATG FIN*****
*******PROJ/////////////////////////////////////////////////////////////

      TVNP=FAUX;
      TVNPC=FAUX;
     Si (('EGA' nomper  'VNIMP   ') et (non (ega (rvp.'DISCPRES') 5)));
      TVNP=VRAI ;
      mar = mar 'ET' mai ;
      sr  = sr  'ET' msi ;
     Finsi ;

*     mess 'nomper=' nomper (rvp.'DISCPRES');
     Si (('EGA' nomper  'VNIMP   ') et (ega (rvp.'DISCPRES') 5));
      TVNPC=VRAI;
      mvnpc=mvnpc et mai ;
      svnpc=svnpc et msi ;
     Finsi ;

     Si (non ('EGA' nomper  'VNIMP   '));
      map = map 'ET' mai ;
      sp  = sp  'ET' msi ;
     Finsi ;

    'FIN' blocpj ;

  matpc mac  = kops 'CMCTSPLT' map ;
*******PROJ*************************************************************
*******PROJ TGRAD  (vrai  Formulation en Gradient) CMCTSPLT     DEBUT*** *******
  Si TGRAD ;
  matpcg macg  = kops 'CMCTSPLT' maig ;
  Finsi ;
*******PROJ                                             -> MATG FIN*****
*******PROJ/////////////////////////////////////////////////////////////

    Si TVNPC; mac=mac et mvnpc; Finsi;
  rvp . 'MATC' = mac ;

*******PROJ*************************************************************
*******PROJ TGRAD  (vrai  Formulation en Gradient) -> MATG      DEBUT*** *******
    SI TGRAD ;   rvp . 'MATG' = macg;  FINSI ;
*******PROJ                                             -> MATG FIN*****
*******PROJ/////////////////////////////////////////////////////////////

  scr mcr  = 'KOPS' 'MATRIK' ;
  Si TVNP ;
  rvp . 'MBTR' = mar ;
  Dunit=Idigv;
  crt= kops 'CMCT' mac mar (Dunit)  ;
  ctr= kops 'CMCT' mar mac (Dunit)  ;
  rrt= kops 'CMCT' mar mar (Dunit)  ;
  mcr= mcr et crt et ctr et rrt ;
  Finsi ;
  rvp . 'TVNP' = TVNP ;

  Si( ega (rvp.'DISCPRES') 5 ) ;
  mess ' Cas des pressions continues' ;
  matpr = matpc et mcr ;
  Sinon ;
  mess ' Cas des pressions discontinues' ;

  matpr = kops 'CMCT' mac mac IDigv ;
  matpr = matpc et matpr et mcr ;

  Finsi ;


  rvp . 'MATP' = matpr ;
  rv.'rvpd'=rvpd;
  rv.'IDigv'=IDigv;
  rv.'Digv'=Digv;
'FINSI' ;
*************
** Fin calcul CMCT pour testp1 et testprj
******************************************
*                           t
***************  Calcul de C p   Pression
'SI' testpr ;

      dt = (rv . 'PASDETPS' . 'DELTAT') '*' (rv . 'ALFA') ;
      rvp . 'DELTAT' = dt ;
      f = 'COPIER' s2 ;
      u = rv . 'INCO' . nomvi ;

      lc = 'EXTRAIRE' digv  'COMP' ;
      fu = 'KCHT'     rvpd 'VECT' 'SOMMET'
                      'COMP' lc ('EXCO' f lc) ;

      'SI' ('EXISTE' rv 'CLIM') ;
        dti = -1.D0 '/' dt ;
        dm1f= 'KOPS' (dt '*' ('KOPS'  fu '*' IDigv))
                     'CLIM' (rv . 'CLIM') 3 ;
        dm1f= dti * dm1f ;
      'SINON'  ;
        dm1f= (-1.D0) '*' ('KOPS' fu '*' IDigv)  ;
      'FINSI'  ;

      rvp . 'PRESSION' = 'KMF' (rvp . 'MATC') dm1f ;

      'KRES' rvp (rvp . 'PRESSION')
             'BETA' (rvp . 'KBETA') (rvp . 'BETA')
             'PIMP' (rvp . 'KPIMP') (rvp . 'PIMP') ;
      rvp . 'GRADP' = 'KMTP' 1 (rvp . 'MATC')
                               (rvp . 'PRESSION') lc ;
      s2 = s2 + (rvp . 'GRADP') ;
      rv.'INCO'.'PRESSION'=rvp . 'PRESSION';

'FINSI' ;

*******PROJ*************************************************************
*******PROJ MDM1 Ici on calcule M D-1 pour ensuite calculer Ctp DEBUT*** *******
*******PROJ on ne calcule M D-1 que si (rv 'MDM1') n'existe pas DEBUT*** *******
*******PROJ ou CALPRE VRAI                                      DEBUT*** *******
'SI' testprj ;

      dt = (rv . 'PASDETPS' . 'DELTAT') '*' (rv . 'ALFA') ;
      rvp . 'DELTAT' = dt ;

** Produit M D-1
 'SI' TMDM1                                  ;
  'SI' (('EXIST' rv 'MDM1') et (NON CALPRE)) ;
     MDM1=rv.'MDM1' ;
  'SINON' ;
     mess ' On calcule MD-1 ' ;
     stn matn= 'KOPS' 'MATRIK' ;

    'REPETER' blocpj1 ('DIME' (rvp . 'LISTOPER')) ;
      nomper1 = 'EXTRAIRE' &blocpj1 (rvp . 'LISTOPER') ;
      notable1= 'MOT' ('TEXTE' ('CHAINE' &blocpj1 nomper1)) ;
*    mess 'Operateur ' nomper1 ;

      si (ega nomper1 'KBBT    ');
      nomiv1= extr  (rvp . notable1 . 'LISTINCO')  1 ;

       'REPETER' blocpj2 ('DIME' (rv . 'LISTOPER')) ;
         nomper2 = 'EXTRAIRE' &blocpj2 (rv . 'LISTOPER') ;
         notable2= 'MOT' ('TEXTE' ('CHAINE' &blocpj2 nomper2)) ;
*        mess 'Operateur ' nomper2 ;

         si (ega nomper2 'DFDT    ');
          nomiv2= extr  (rv . notable2 . 'LISTINCO')  1 ;
           si ('EGA' nomiv2 nomiv1) ;

            domzp=rv . notable2 . 'DOMZ' ;
            msi mai='DFDT' (rv . notable2) ;
            matn = matn et mai ;
            sti = kcht domzp vect sommet comp lc vuni;
           finsi ;
         finsi ;
       'FIN' blocpj2 ;
      finsi ;
    'FIN' blocpj1 ;

  MDM1='KMF' matn IDiag ;

    Si(EGA ISCHT 1);
    MDM1=MDM1 * ((dt*2.)/3.) ;
    Sinon ;
    MDM1=MDM1 * dt ;
    Finsi ;

  rv.'MDM1' = MDM1 ;

*******PROJ                                   MDM1 -> rv.'MDM1' FIN*****
*******PROJ/////////////////////////////////////////////////////////////
  'FINSI';
 'FINSI';
*******PROJ*************************************************************
*******PROJ            t  n-1                                   DEBUT*** *******
*******PROJ Calcul de C  P                                      DEBUT*** *******

  TVNP=rvp.'TVNP' ;

  'SI' ('EXIST' (rv.'INCO') 'PRESSION') ;
       PPI = rv.'INCO'.'PRESSION'       ;
     'SI' ('EXIST' (rv.'INCO') 'PNM2')  ;
* TPNM2 elimination of end of step velocity (2 Pn - Pn-1)
       PPI = 2*(PPI) - rv.'INCO'.'PNM2' ;
     'FINSI'                            ;

*Formulation en u grad p
      Si (Exist rvp 'MATG');
      cpre = 'KMF' (rvp . 'MATG') PPI                    'TRAN' ;
*Formulation en p div u
      Sinon;
      cpre = 'KMF' (rvp . 'MATC') PPI                    'TRAN' ;
      Finsi ;

      Si TVNP ;
      cxre = 'KMF' (rvp . 'MBTR') PPI                    'TRAN' ;
      cpre = cpre et cxre ;
      Finsi ;

*******PROJ MDM1
      Si TMDM1 ;
* consistence selon (Gresho)
      gradpres = 'KOPS' MDM1 '*' cpre ;
      Sinon ;
* consistence selon (Guermond)
      gradpres =                 cpre     ;
      Finsi ;

      oublier cpre ;
      rv.'INCO'.'GRADPRES' = 'NOMC' lcu lc gradpres;

*Formulation en u grad p
      Si (Exist rvp 'MATG');
      s2 = sf - (rv.'INCO'.'GRADPRES') + st ;
      Sinon ;
*Formulation en p div u
      s2 = sf + (rv.'INCO'.'GRADPRES') + st     ;
      Finsi ;

  'FINSI' ;

*******PROJ                  t  n-1                             FIN*****
*******PROJ        MDM1 '*' C  P        -> rv.'INCO'.'GRADPRES' FIN*****
*******PROJ                                          t  n-1     FIN*****
*******PROJ         si (p div u)        -> S2 = F + C  P  + st  FIN*****
*******PROJ                                          t  n-1     FIN*****
*******PROJ         si (u grad p)       -> S2 = F - C  P  + st  FIN*****
*******PROJ/////////////////////////////////////////////////////////////
'FINSI' ;

**********  FIN Traitement PRESSION ************************
*   mess ' FIN Traitement PRESSION' ;

    'SI' ('EXISTE' rv 'CLIM') ;
      s1 = rv . 'CLIM' ;
    'SINON' ;
      s1=' ' ;
    'FINSI'  ;
    rv . 'S2' = s2 ;

*******************************************************************
* Résolution hors QDM méthode de projection
 'SI'((NON testprj) ou (EGA mdfdt 0));
*mess '* Résolution hors QDM méthode de projection ';

*   mess ' ====================> calprec '; list calprec ;
    'SI' rv.'calass' ;
     rv . 'METHINV' . 'MATASS' =ma1 ;
     rv.'calass'=FAUX ;
    'FINSI' ;

    'SI' rv.'calprec' ;
     rv . 'METHINV' . 'MAPREC' = ma1    ;
     rv.'calprec'=FAUX ;
    'FINSI' ;

    rv . 'METHINV' . 'XINIT'  = resmn ;

    res = 'KRES'  ma1 'TYPI' (rv . 'METHINV')
                      'CLIM' s1
                      'SMBR' s2
                      'IMPR' IMPKRES ;

 'FINSI' ;

'SI' (testprj et (non(EGA mdfdt 0)));
*******PROJ*************************************************************
*******PROJ  Résolution QDM                                     DEBUT*** *******
*******PROJ  (On éclate les résolutions)                        DEBUT*** *******

* Résolution QDM méthode de projection (On éclate les résolutions)
*mess ' Résolution QDM méthode de projection';
   res mm1= kops 'MATRIK' ;
   liscom=extr s1 'COMP';
   nbcom=dime liscom ;
*   MEss ' NBCOM=' nbcom ;

   Si(NON(EXIST RV 'TABRES')); RV.'TABRES'=TABLE ; Finsi ;
   Si(NON(EGA ('TYPE' RV.'TABRES') 'TABLE')); RV.'TABRES'=TABLE;Finsi;

   repeter Bclcom nbcom  ;
   nmc=extr liscom &Bclcom;
*   Mess ' Composante : ' nmc ;
    ma1i=kops 'EXTRCOMP' nmc 'SCAL' ma1;
    s1i    = exco s1    nmc 'NOID' ;
    s2i    = exco s2    nmc 'NOID' ;
    resmni = exco resmn nmc 'NOID' ;

    MATASSI =chai 'FORMAT' '(A6,I1)' 'MATASS' &Bclcom;
    MAPRECI =chai 'FORMAT' '(A6,I1)' 'MAPREC' &Bclcom;

    'SI' (rv.'calass' ou (NON ('EXIST' (RV.'TABRES') MATASSI))) ;
     rv . 'TABRES' . MATASSI = ma1i;
     rv.'calass'=FAUX ;
    'FINSI' ;

    'SI' (rv.'calprec' ou (NON ('EXIST' (RV.'TABRES') MAPRECI)));
     mess 'On recalcule le preconditionneur ';
     rv . 'TABRES' . MAPRECI = ma1i;
     rv.'calprec'=FAUX ;
    'FINSI' ;

    rv . 'METHINV' . 'MATASS' = rv . 'TABRES' . MATASSI ;
    rv . 'METHINV' . 'MAPREC' = rv . 'TABRES' . MAPRECI ;
    rv . 'METHINV' . 'XINIT'  = resmni ;


    resi = 'KRES'  ma1i 'TYPI' (rv . 'METHINV')
                      'CLIM' s1i
                      'SMBR' s2i
                      'IMPR' IMPKRES ;
    resi = nomc resi nmc ;
    res=res et resi ;
    Fin Bclcom ;
    oubli ma1 ;
*mess ' Fin Résolution QDM méthode de projection';
* Fin Résolution QDM méthode de projection
*******PROJ  Résolution QDM                              -> res FIN*****
*******PROJ  (On éclate les résolutions)                        FIN*****
*******PROJ/////////////////////////////////////////////////////////////
'FINSI' ;

'SI' testprj ;
*******PROJ*************************************************************
*******PROJ  ETAPE DE PROJECTION                                DEBUT*** *******
*******PROJ  on calcul cun (alias c U tilde)                    DEBUT*** *******
*     mess 'ETAPE DE PROJECTION ' ;
*   _n
* C U
      cun = ('KMF' (rvp . 'MATC') res) ;
      Si TVNP ;
      cxn = ('KMF' (rvp . 'MBTR') res) ;
      cun = cun et cxn ;
      Finsi ;

*    mess ' On calcule les seconds membres de l équation de pression ' ;
*    mess ' s ils existent (opérateurs FIMP)                         ' ;

    'REPETER' blocpj ('DIME' (rvp . 'LISTOPER')) ;
      nomper = 'EXTRAIRE' &blocpj (rvp . 'LISTOPER') ;
      notable= 'MOT' ('TEXTE' ('CHAINE' &blocpj nomper)) ;
      si (ega nomper 'FIMP    ');
*   mess 'Seconds membres de l équation de pression Opérateur ' nomper ;
      msi mai=('TEXTE' nomper) (rvp . notable) ;
      cun = cun et msi ;
      finsi ;
    'FIN' blocpj ;

      cun = cun * (-1./dt) ;

*   mess ' ====================> calprecp '; list calprecp ; 
      'SI' calassp;
      matass1=matpr ;
      rvp.'matass1'=matass1 ;
      'FINSI' ;
      
     'SI' calprecp                          ;
      'SI' (RV.IMPR >EG 1)                  ;
      'MESS' ' On preconditionne CMCT '     ;
      'FINSI'                               ;
       maprec1 = matpr ;
       rvp.'maprec1'=maprec1 ;
      'FINSI' ;
      rvp . 'METHINV' . 'MATASS' = matass1 ;
      rvp . 'METHINV' . 'MAPREC' = maprec1 ;
      rvp . 'METHINV' . 'XINIT'  = resmn2  ;

                    sl= 'KRES' matpr 'TYPI' (rvp . 'METHINV')
                        'CLIM' (rvp . CLIM )
                        'SMBR' cun
                        'IMPR' IMPKRES  ;  oublier cun ;

      oublier resmn2 ; resmn2 = sl ;
      ctl = 'KMF' (rvp . 'MATC') sl 'TRAN' ;
      Si TVNP ;
      cxl = 'KMF' (rvp . 'MBTR') sl 'TRAN' ;
      ctl = ctl + cxl ;
      Finsi ;

* elimination of end of step velocity (Si exist PNM2) (on ne corrige pas)
     'SI'(NON(TPNM2));
     'SI' (NON ('EXIST' (rv.'INCO') 'PNM2')) ;
      a=nomc lcu lc ('KOPS' IDigv '*' ctl) ;
      res  =  res + (a*dt) ;
     'FINSI' ;
     'FINSI' ;

      oublier ctl ;

*******PROJ                                -> (alias c U tilde) FIN*****
*******PROJ                                -> sl (alias lambda) FIN*****
*******PROJ                                -> on corrige u      FIN*****
*******PROJ/////////////////////////////////////////////////////////////
'FINSI' ;

*****  Avancement en temps
*?  Si (testprj et ('EGA' mdfdt 0)) ; IMPTCRR=RV.'IMPR' ;  finsi ;
 Si ('EGA' mdfdt 0) ; IMPTCRR=RV.'IMPR' ;  finsi ;
    IMPKRES=0 ;
*   mess 'On passe dans TCRR ' ;
    eps = 'TCRR' res omeg (rv . 'INCO') 'IMPR' IMPTCRR ;

    'OUBLIER' resmn ;
    resmn = res ;
    'MENAGE' ;
  'FIN' bloci ;
  irt=0 ;

* mess ' ITMA= ' (rv . 'ITMA') ' mdfdt= ' mdfdt ;
  'SI' ('EGA' (rv . 'ITMA') 0) ;
*   mess ' ON PASSE PLUS DS TCNM>>>>>>>>>>>>>>' ;
     irt = 'TCNM' rv 'NOUP';
  'SINON'                                         ;
*   mess ' ON PASSE DS TCNM>>>>' (rv . 'ITMA') mdfdt;
     irt = 'TCNM' rv ;
  'FINSI' ;

*****  Avancement en temps  algorithme de projection

     'SI' (testprj) ;
       'SI' calprecp;
         calprecp= FAUX ;
       'SINON' ;
       'SI' ('NON' calassp) ;
                'OUBLIER' matpr ;
       'FINSI' ;         
       'FINSI' ;
       calassp=FAUX ;
       rvp.'calassp'=calassp ;
       rvp.'calprecp'=calprecp ;
     'FINSI' ;

*******PROJ*************************************************************
*******PROJ  P(n+1) = P(n) + sl                                 DEBUT*** *******
* Algorithme de projection  P(n+1) = P(n) + sl
   'SI' testprj ;

     'SI' (NON ('EXIST' (rv.'INCO') 'PRESSION'));
         rv.'INCO'.'PRESSION' = sl;
         Si TPNM2 ; rv.'INCO'.'PNM2' = sl ; Finsi ;
     'SINON' ;
         PNM1=rv.'INCO'.'PRESSION';
        si ( EGA ISCHT 1) ;
         PN=PNM1 + (1.5*sl) ;
        sinon ;
         PN=PNM1 + sl ;
        finsi ;

       Si TPNM2 ; rv.'INCO'.'PNM2'=PNM1 ;  Finsi ;
       rv.'INCO'.'PRESSION'=PN   ;
     'FINSI' ;

     Si (EGA TYPROJ 'PSCT') ;
     rv.'INCO'.'PRESSION' = sl;
     Finsi ;

       'OUBLIER' sl ;
   'FINSI' ;
*******PROJ  P(n+1) = P(n) + sl                                 FIN*****
*******PROJ/////////////////////////////////////////////////////////////
*****  Avancement en temps  FIN


  'SI' testran ;
    rv . 'CO' . 'VITESSE' ='KOPS' (rv . 'INCO' . nomvi)
                             '-'  (rv . 'SEDIM') ;
    k = 'ABS' (rv . 'INCO' . 'KN') ; 
    e = 'ABS' (rv . 'INCO' . 'EN') ;
    k = 'KOPS' ('KOPS' k '*' k) '/' e ;
    dif = 'KOPS' ('KOPS' k '*' 0.09) '+' (rv . 'COEF') ;
    rv . 'CO' . 'DIFFU'   = 'NOEL' rvpd dif ;
    rv . 'CO' . 'TEMPERA' = rv . 'INCO' . 'CN' ;
  'FINSI' ;
  'MENAGE' ;

  'SI' ('EGA' irt 1) ;
    'MESSAGE' ' Temps final atteint : '
              (rv . 'PASDETPS' . 'TPS') ;
    'QUITTER' bloc1 ;
  'FINSI' ;
'FIN' bloc1 ;

'SI' testpr ;
  rvp . 'PRESSION' = 'KCHT' rvpd 'SCAL' 'CENTRE'
                            (rvp . 'PRESSION') ;
  rvp . 'PN'       = 'ELNO' rvpd
                            (rvp . 'PRESSION') ;
'FINSI' ;
************************    E X E C ************************************
'FINPROC' ;

 
opti dime 2 elem QUA4 ;
GRAPH=VRAI ;
GRAPH=FAUX ;
*COMPLET=VRAI;
COMPLET=FAUX ;


DISCR='QUAF';

Si Complet ;
 n1= 42  ; n2= 42  ;
*n1= 60  ; n2= 60  ;
*n1= 420 ; n2= 420 ;
*n1= 100 ; n2= 100 ;
Sinon;
 n1= 20  ; n2= 20  ;
Finsi ;

p1= 0 0 ;p2=1 0 ;p3=1 1 ; p4 = 0 1 ;
ab= p1 d n1 p2 ;
mt1= trans ab n2 (0. 1.) ;
bc= cote 2 mt1 ;
cd= cote 3 mt1 ;
da= cote 4 mt1 ;
mt2= inve mt1 ;

Mmt1 =  chan mt1 QUAF ;
Mmt2 =  chan mt2 QUAF ;
elim (Mmt1 et Mmt2) 1.e-5 ;

$mt1= mode Mmt1 'NAVIER_STOKES' DISCR ;
$mt2= mode Mmt2 'NAVIER_STOKES' DISCR ;
mt1= doma $mt1 maillage ;

*zz= chan 'CHAM' ((coor 2 mt1) - (coor 1 mt1)) mt1 'NOEUD' ;
zz=((coor 2 mt1) - (coor 1 mt1));
*trace zz mt1 ;
im= zz MASQU 'INFERIEUR' 0. ;
tref= (kcht $mt1 scal sommet 1.) * im ;
*trace tref mt1 ;

***==========
 rv1= eqex 'EQUA' 'RIGIDITE'
 'U' 'T' 'P' $mt1 'VITESSE' 'TEMPERATURE' 'PRESSION' 'CENTREP1'
 'PERM'  'UN' 'TN' 'PN' NITER 1 OMEGA 1.
 OPTI 'EF' 'IMPL' 'SUPG' CMD 1.
 ZONE $mt1 'OPER' TSCA 'RO' 1.e-5 'UN' 0.  INCO 'T'
 'CLIM' T TIMP (ab et bc) 1. T TIMP (cd et da) 0.
 ;

rv1.inco=table 'INCO' ;
rv1.'NUMASSI'=1 ;

***==========


rv1.inco.'TN'=kcht $mt1 scal sommet 0. ;
rv1.inco.'PN'=kcht $mt1 scal sommet 0. ;
rv1.inco.'LB'=kcht $mt1 scal sommet 1. ;
rv1.inco.'RO'=kcht $mt2 scal centre 100. ;
rv1.inco.'UN'=kcht $mt1 vect sommet (1. 1.);

      exec  rv1;

      tn= exco 'SCAL' rv1.inco.'TN' ;


Si GRAPH ;trace TN mt1 'TITR' 'SUPG' ;Finsi ;

dg=doma $mt1 'XXDIAGSI' ;
erl2= somt ( dg * (tn - tref) * (tn - tref)) ;
mess 'ERL2=' erl2 ;
Si (erl2 > 2.7e-2); erreur 5 ; Finsi ;
*     opti donn 5 ;

* Cas CENTREE
      rv1.'1TSCA'.'KOPT'.'IDCEN'=1 ;
      exec  rv1;
      tn= exco 'SCAL' rv1.inco.'TN' ;

Si GRAPH ;trace TN mt1 'TITR' 'CENTREE' ;Finsi ;

erl2= somt ( dg * (tn - tref) * (tn - tref)) ;
mess 'ERL2=' erl2 ;
Si (erl2 > 8.e-2); erreur 5 ; Finsi ;

*     opti donn 5 ;
* Cas SUPGDC
      rv1.inco.'TN'=kcht $mt1 scal sommet 0. ;
      rv1.'1TSCA'.'KOPT'.'IDCEN'=2 ;
      rv1.'NITER'= 5               ;
      exec  rv1;
      tn= exco 'SCAL' rv1.inco.'TN' ;

Si GRAPH ;trace TN mt1 'TITR' 'SUPGDC' ;Finsi ;

erl2= somt ( dg * (tn - tref) * (tn - tref)) ;
mess 'ERL2=' erl2 ;
Si (erl2 > 3.7e-2); erreur 5 ; Finsi ;

 fin ;
 

 

 

© Cast3M 2003 - All rights reserved.
Disclaimer