/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T   D E S   D I S C O N T I N U I T E S   D E   ' v $xrs/referentiel3D.11$I discontinuites '  :                      */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Ce programme correspond a la date du 20170202092857                                                            */
/*                  a la sequence 'v $xrs/surfaces.12$I EGAL.cx.Fxyz' de                                                             */
/*                  calcul de la coordonnee 'cx' de 'v $xrs/helicoide.11$K'.                                                         */
/*                  Or 'v $xrs/helicoide.11$I Composante_X1' utilise                                                                 */
/*                  'v $xrs/referentiel3D.11$I CalculNouveauReferentiel'                                                             */
/*                  dans lequel, de par les tests de non nullite des                                                                 */
/*                  composantes 'Z1', 'Z2' ou 'Z3', il y a un risque                                                                 */
/*                  d'introduction de discontinuites. C'est ce que l'on verifie                                                      */
/*                  ici en calculant 'cx' pour differentes valeurs du                                                                */
/*                  parametre 'parametre_R' nulle ou proches de zero...                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xtc/helicoide.11.01$c' :                                                                                       */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20170202092857).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#include  <stdio.h>

#define   TABULATION                                                                                                                    \
          14

extern    double    sqrt();
extern    double    cos();
extern    double    sin();

double    Definition_OX_a2=1;
double    Definition_OX_a3=1;

double    parametre_Ra=0.1;
double    parametre_Rb=0.1;

double    parametre_R=1,d_parametre_R=0;
double    parametre_A=1,d_parametre_A=0;
double    parametre_B=0,d_parametre_B=0;
double    parametre_C=0,d_parametre_C=0;
double    parametre_D=0,d_parametre_D=0;
double    parametre_E=0,d_parametre_E=0;
double    parametre_F=0,d_parametre_F=0;

double    d_u=1;
double    d_v=1;

double    Composante_X1(double u,double v)
          {
          double    Composante=444719;

          double    d1_XEspace=((((((d_parametre_R*cos(v)))+((parametre_R*((((0-sin(v)))*d_v))))))
                               +(((((d_parametre_B*u)+(parametre_B*d_u)))+(((d_parametre_C*v)+(parametre_C*d_v))))))
                                );
          double    d1_YEspace=((((((d_parametre_R*sin(v)))+((parametre_R*((cos(v)*d_v))))))
                               +(((((d_parametre_D*u)+(parametre_D*d_u)))+(((d_parametre_E*v)+(parametre_E*d_v))))))
                                );
          double    d1_ZEspace=(((((d_parametre_F*u)+(parametre_F*d_u)))+(((d_parametre_A*v)+(parametre_A*d_v)))));

          unsigned  long int CalculerLesComposantes=1;

          double    X1=444719;
          double    X2=444719;
          double    X3=444719;
          double    Y1=444719;
          double    Y2=444719;
          double    Y3=444719;
          double    Z1=444719;
          double    Z2=444719;
          double    Z3=444719;

          Z1=d1_XEspace;
          Z2=d1_YEspace;
          Z3=d1_ZEspace;

          if        (Z1!=0)
                    {
                    if        (Z1!=0)
                              {
                              printf("  Z1/");

                              X2=Definition_OX_a2;
                              X3=Definition_OX_a3;
                              X1=((((0-(((X2*Z2)+(X3*Z3)))))/Z1));
                              }
                    else
                              {
                              }
                    }
          else
                    {
                    if        (Z2!=0)
                              {
                              if        (Z2!=0)
                                        {
                                        printf("  Z2/");

                                        X3=Definition_OX_a2;
                                        X1=Definition_OX_a3;
                                        X2=((((0-(((X3*Z3)+(X1*Z1)))))/Z2));
                                        }
                              else
                                        {
                                        }
                              }
                    else
                              {
                              if        (Z3!=0)
                                        {
                                        if        (Z3!=0)
                                                  {
                                                  printf("  Z3/");

                                                  X1=Definition_OX_a2;
                                                  X2=Definition_OX_a3;
                                                  X3=((((0-(((X1*Z1)+(X2*Z2)))))/Z3));
                                                  }
                                        else
                                                  {
                                                  printf("--/");
                                                  }
                                        }
                              else
                                        {
                                        CalculerLesComposantes=0;
                                        }
                              }
                    }

          if        (CalculerLesComposantes==1)
                    {
                    Y1=(Z2*X3)+(((0-Z3)*X2));
                    Y2=((0-((((Z1*X3)+(((0-Z3)*X1)))))));
                    Y3=(Z1*X2)+(((0-Z2)*X1));

                              {
                              double    norme=sqrt((((X1*X1)+(X2*X2)))+(X3*X3));

                              X1=X1/norme;
                              X2=X2/norme;
                              X3=X3/norme;
                              }

                              {
                              double    norme=sqrt((((Y1*Y1)+(Y2*Y2)))+(Y3*Y3));

                              Y1=Y1/norme;
                              Y2=Y2/norme;
                              Y3=Y3/norme;
                              }

                              {
                              double    norme=sqrt((((Z1*Z1)+(Z2*Z2)))+(Z3*Z3));

                              Z1=Z1/norme;
                              Z2=Z2/norme;
                              Z3=Z3/norme;
                              }
                    Composante=(X1);
                    }
          else
                    {
                    Composante=0;
                    }

          printf("CX=%+*e",TABULATION,Composante);

          return(Composante);
          }

double    Composante_Y1(double u,double v)
          {
          double    Composante=444719;

          double    d1_XEspace=((((((d_parametre_R*cos(v)))+((parametre_R*((((0-sin(v)))*d_v))))))
                               +(((((d_parametre_B*u)+(parametre_B*d_u)))+(((d_parametre_C*v)+(parametre_C*d_v))))))
                                );
          double    d1_YEspace=((((((d_parametre_R*sin(v)))+((parametre_R*((cos(v)*d_v))))))
                               +(((((d_parametre_D*u)+(parametre_D*d_u)))+(((d_parametre_E*v)+(parametre_E*d_v))))))
                                );
          double    d1_ZEspace=(((((d_parametre_F*u)+(parametre_F*d_u)))+(((d_parametre_A*v)+(parametre_A*d_v)))));

          unsigned  long int CalculerLesComposantes=1;

          double    X1=444719;
          double    X2=444719;
          double    X3=444719;
          double    Y1=444719;
          double    Y2=444719;
          double    Y3=444719;
          double    Z1=444719;
          double    Z2=444719;
          double    Z3=444719;

          Z1=d1_XEspace;
          Z2=d1_YEspace;
          Z3=d1_ZEspace;

          if        (Z1!=0)
                    {
                    if        (Z1!=0)
                              {
                              printf("  Z1/");

                              X2=Definition_OX_a2;
                              X3=Definition_OX_a3;
                              X1=((((0-(((X2*Z2)+(X3*Z3)))))/Z1));
                              }
                    else
                              {
                              }
                    }
          else
                    {
                    if        (Z2!=0)
                              {
                              if        (Z2!=0)
                                        {
                                        printf("  Z2/");

                                        X3=Definition_OX_a2;
                                        X1=Definition_OX_a3;
                                        X2=((((0-(((X3*Z3)+(X1*Z1)))))/Z2));
                                        }
                              else
                                        {
                                        }
                              }
                    else
                              {
                              if        (Z3!=0)
                                        {
                                        if        (Z3!=0)
                                                  {
                                                  printf("  Z3/");

                                                  X1=Definition_OX_a2;
                                                  X2=Definition_OX_a3;
                                                  X3=((((0-(((X1*Z1)+(X2*Z2)))))/Z3));
                                                  }
                                        else
                                                  {
                                                  printf("--/");
                                                  }
                                        }
                              else
                                        {
                                        CalculerLesComposantes=0;
                                        }
                              }
                    }

          if        (CalculerLesComposantes==1)
                    {
                    Y1=(Z2*X3)+(((0-Z3)*X2));
                    Y2=((0-((((Z1*X3)+(((0-Z3)*X1)))))));
                    Y3=(Z1*X2)+(((0-Z2)*X1));

                              {
                              double    norme=sqrt((((X1*X1)+(X2*X2)))+(X3*X3));

                              X1=X1/norme;
                              X2=X2/norme;
                              X3=X3/norme;
                              }

                              {
                              double    norme=sqrt((((Y1*Y1)+(Y2*Y2)))+(Y3*Y3));

                              Y1=Y1/norme;
                              Y2=Y2/norme;
                              Y3=Y3/norme;
                              }

                              {
                              double    norme=sqrt((((Z1*Z1)+(Z2*Z2)))+(Z3*Z3));

                              Z1=Z1/norme;
                              Z2=Z2/norme;
                              Z3=Z3/norme;
                              }
                    Composante=(Y1);
                    }
          else
                    {
                    Composante=0;
                    }

          printf("CY=%+*e",TABULATION,Composante);

          return(Composante);
          }

double    Composante_Z1(double u,double v)
          {
          double    Composante=444719;

          double    d1_XEspace=((((((d_parametre_R*cos(v)))+((parametre_R*((((0-sin(v)))*d_v))))))
                               +(((((d_parametre_B*u)+(parametre_B*d_u)))+(((d_parametre_C*v)+(parametre_C*d_v))))))
                                );
          double    d1_YEspace=((((((d_parametre_R*sin(v)))+((parametre_R*((cos(v)*d_v))))))
                               +(((((d_parametre_D*u)+(parametre_D*d_u)))+(((d_parametre_E*v)+(parametre_E*d_v))))))
                                );
          double    d1_ZEspace=(((((d_parametre_F*u)+(parametre_F*d_u)))+(((d_parametre_A*v)+(parametre_A*d_v)))));

          unsigned  long int CalculerLesComposantes=1;

          double    X1=444719;
          double    X2=444719;
          double    X3=444719;
          double    Y1=444719;
          double    Y2=444719;
          double    Y3=444719;
          double    Z1=444719;
          double    Z2=444719;
          double    Z3=444719;

          Z1=d1_XEspace;
          Z2=d1_YEspace;
          Z3=d1_ZEspace;

          if        (Z1!=0)
                    {
                    if        (Z1!=0)
                              {
                              printf("  Z1/");

                              X2=Definition_OX_a2;
                              X3=Definition_OX_a3;
                              X1=((((0-(((X2*Z2)+(X3*Z3)))))/Z1));
                              }
                    else
                              {
                              }
                    }
          else
                    {
                    if        (Z2!=0)
                              {
                              if        (Z2!=0)
                                        {
                                        printf("  Z2/");

                                        X3=Definition_OX_a2;
                                        X1=Definition_OX_a3;
                                        X2=((((0-(((X3*Z3)+(X1*Z1)))))/Z2));
                                        }
                              else
                                        {
                                        }
                              }
                    else
                              {
                              if        (Z3!=0)
                                        {
                                        if        (Z3!=0)
                                                  {
                                                  printf("  Z3/");

                                                  X1=Definition_OX_a2;
                                                  X2=Definition_OX_a3;
                                                  X3=((((0-(((X1*Z1)+(X2*Z2)))))/Z3));
                                                  }
                                        else
                                                  {
                                                  printf("--/");
                                                  }
                                        }
                              else
                                        {
                                        CalculerLesComposantes=0;
                                        }
                              }
                    }

          if        (CalculerLesComposantes==1)
                    {
                    Y1=(Z2*X3)+(((0-Z3)*X2));
                    Y2=((0-((((Z1*X3)+(((0-Z3)*X1)))))));
                    Y3=(Z1*X2)+(((0-Z2)*X1));

                              {
                              double    norme=sqrt((((X1*X1)+(X2*X2)))+(X3*X3));

                              X1=X1/norme;
                              X2=X2/norme;
                              X3=X3/norme;
                              }

                              {
                              double    norme=sqrt((((Y1*Y1)+(Y2*Y2)))+(Y3*Y3));

                              Y1=Y1/norme;
                              Y2=Y2/norme;
                              Y3=Y3/norme;
                              }

                              {
                              double    norme=sqrt((((Z1*Z1)+(Z2*Z2)))+(Z3*Z3));

                              Z1=Z1/norme;
                              Z2=Z2/norme;
                              Z3=Z3/norme;
                              }
                    Composante=(Z1);
                    }
          else
                    {
                    Composante=0;
                    }

          printf("CZ=%+*e",TABULATION,Composante);

          return(Composante);
          }

double    Calcul_cx(double u_effectif,double v_effectif)
          {
          double  CX=Composante_X1(u_effectif,v_effectif);
          double  CY=Composante_Y1(u_effectif,v_effectif);
          double  CZ=Composante_Z1(u_effectif,v_effectif);
                                        /* On notera que 'CZ' est calcule alors qu'elle est en fait inutile. Cette inutilite vient   */
                                        /* du fait que dans la formule "exacte" donnant 'cx', elle apparait bien, mais avec un       */
                                        /* facteur multiplicatif nul d'ou sa disparition lors du processus d'optimisation et         */
                                        /* d'embellissement du code '$c' resultant de 'v $xrs/helicoide.11$K'...                     */

          double  cx=444719;

          cx=((((((parametre_Ra*cos(u_effectif)))*CX))
             +((((((parametre_Rb*sin(u_effectif)))*CY))
             +(((((((parametre_R)*cos(v_effectif)))
             +(((parametre_B*u_effectif)
             +(parametre_C*v_effectif))))))))))
              );

          return(cx);
          }

#define   TEST_CALCUL_cx(R)                                                                                                             \
          {                                                                                                                             \
          double    cx;                                                                                                                 \
                                                                                                                                        \
          parametre_R=R;                                                                                                                \
                                                                                                                                        \
          cx=Calcul_cx(u_effectif,v_effectif);                                                                                          \
                                                                                                                                        \
          printf("         ");                                                                                                          \
          printf("R=%+*e     cx(%+g,%+g)=%+e\n",TABULATION,parametre_R,u_effectif,v_effectif,cx);                                       \
          }

main()
          {
          double    u,u_effectif;
          double    v,v_effectif;

          u=1.23;
          v=2.37;

          u_effectif=u;
          v_effectif=v;

          TEST_CALCUL_cx(1e-7);
          TEST_CALCUL_cx(1e-8);
          TEST_CALCUL_cx(1e-153);
          TEST_CALCUL_cx(1e-154);
          TEST_CALCUL_cx(1e-159);
          TEST_CALCUL_cx(0);
                                        /* Et oui, on aurait pu croire que 1e-159 c'etait pratiquement 0, mais il n'en est rien et   */
                                        /* ce a cause des tests du type 'if(Z1!=0)' ci-dessus...                                     */
          }



Copyright © Jean-François Colonna, 2021-2023.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2021-2023.