64 LISTE_FEM_NOEUD::iterator it;
68 no->change_solution(
INFINI);
70 no->change_numero_opt(i);
78 for (
int i=0;i<nb;i++)
90 std::vector<FEM_NOEUD*> lst;
93 parse.
decode(entite,
"&",param);
96 for (
int i=0;i<nb;i++)
98 int num=atoi(param[0].argument[i].c_str());
104 for (
int j=0;j<nbele;j++)
116 for (
int j=0;j<nbele;j++)
122 for (
int k=0;k<nbno;k++)
133 for (
int j=0;j<nbele;j++)
139 for (
int k=0;k<nbno;k++)
150 for (
int j=0;j<nbele;j++)
156 for (
int k=0;k<nbno;k++)
243 LISTE_FEM_NOEUD::iterator it;
707 #define LARGE_VAL (1e99)
708 #define SMALL_VAL (0)
709 #define PI (3.141592653589793238462643)
714 return ( x == 0 ? 0 : ( x < 0 ? -1 : 1 ) );
729 cout <<
"overflow" << endl;
742 if ( (
a + b ) ==
a )
745 cout <<
"overflow" << endl;
757 double MG_FAST_MARCHING::dt2d (
double xi,
double xb,
double yb,
double zb,
double xd,
double yd,
double zd,
double tb,
double v )
763 return ( ft+
fdiv (
sqrt ( fx*fx+fy*fy+fz*fz ),v ) );
767 int MG_FAST_MARCHING::Solve_dt2d (
double ax,
double ay,
double az,
double bx,
double by,
double bz,
double dx,
double dy,
double dz,
double at,
double bt,
double v,
double &dt,
double &alpha )
780 double bb=xb*xb+yb*yb+zb*zb;
781 double sbb=
sqrt ( bb );
782 double bd=xb*xd+yb*yd+zb*zd;
784 double xi0=
fdiv ( bd,bb );
785 double x0= ( xi0*xb-xd );
786 double y0= ( xi0*yb-yd );
787 double z0= ( xi0*zb-zd );
788 double rho0=
sqrt ( x0*x0+y0*y0+z0*z0 );
789 double calpha=
fdiv ( v*tb,sbb );
795 else if ( calpha<-1.0 )
801 double dxi=
fdiv ( calpha*rho0,sbb*
sqrt ( 1-calpha*calpha ) );
816 td=
dt2d ( xi,xb,yb,zb,xd,yd,zd,tb,v );
823 int MG_FAST_MARCHING::val2d (
double ax,
double ay,
double az,
double bx,
double by,
double bz,
double dx,
double dy,
double dz,
double at,
double bt,
double v,
double& dt,
double &alpha )
825 return Solve_dt2d ( ax,ay,az,bx,by,bz,dx,dy,dz,at,bt,v,dt,alpha );
828 double MG_FAST_MARCHING::dt3d (
double xi,
double eta,
double xb,
double yb,
double zb,
double xc,
double yc,
double zc,
double xd,
double yd,
double zd,
double tb,
double tc,
double v )
830 double fx=xi*xb+eta*xc-xd;
831 double fy=xi*yb+eta*yc-yd;
832 double fz=xi*zb+eta*zc-zd;
833 double ft=xi*tb+eta*tc;
834 return ( ft+
fdiv (
sqrt ( fx*fx+fy*fy+fz*fz ),v ) );
838 int MG_FAST_MARCHING::Solve_dt3d (
double ax,
double ay,
double az,
double bx,
double by,
double bz,
double cx,
double cy,
double cz,
double dx,
double dy,
double dz,
double at,
double bt,
double ct,
double v,
double &dt,
double &alpha,
double &beta )
854 double bc=xb*xc+yb*yc+zb*zc;
855 double bb=xb*xb+yb*yb+zb*zb;
856 double cc=xc*xc+yc*yc+zc*zc;
857 double bd=xb*xd+yb*yd+zb*zd;
858 double cd=xc*xd+yc*yd+zc*zd;
861 double xbvc= ( yb*zc-zb*yc );
862 double ybvc= ( zb*xc-xb*zc );
863 double zbvc= ( xb*yc-yb*xc );
864 double nbvc=
sqrt ( xbvc*xbvc+ybvc*ybvc+zbvc*zbvc );
866 double xbvbvc=- ( yb*zbvc-zb*ybvc );
867 double ybvbvc=- ( zb*xbvc-xb*zbvc );
868 double zbvbvc=- ( xb*ybvc-yb*xbvc );
869 double nbvbvc=
sqrt ( xbvbvc*xbvbvc+ybvbvc*ybvbvc+zbvbvc*zbvbvc );
872 double rho0=fabs ( ( xbvc*xd+ybvc*yd+zbvc*zd ) / ( nbvc ) );
873 double i0=bd/
sqrt ( bb );
874 double j0= ( xbvbvc*xd+ybvbvc*yd+zbvbvc*zd ) / ( nbvbvc );
875 double t=bc/ (
sqrt ( bb ) *
sqrt ( cc ) );
876 double tt=t/
sqrt ( 1-t*t );
877 double xi0=bd/bb- ( j0*tt ) /
sqrt ( bb );
879 cout <<
"xi=" << xi0 <<
" ";
881 double eta0=j0*nbvbvc/ ( xbvbvc*xc+ybvbvc*yc+zbvbvc*zc );
883 cout <<
"eta=" << eta0 << endl;
885 double xproj=xi0*xb+eta0*xc;
886 double yproj=xi0*yb+eta0*yc;
887 double zproj=xi0*zb+eta0*zc;
889 cout << xproj <<
" "<< yproj <<
" " << zproj << endl;
893 Square_Matrix M ( 3 ),Minv ( 3 );
894 Vector gradTxyz ( 3 ),gradTxieta ( 3 ),gradTxieta2 ( 3 );;
901 M ( 2,0 ) =yb*zc-zb*yc;
902 M ( 2,1 ) =zb*xc-xb*zc;
903 M ( 2,2 ) =xb*yc-yb*xc;
913 gradTxieta.Display();
915 Minv.Mult ( gradTxieta,gradTxyz );
920 Minv.Mult ( gradTxyz,gradTxieta2 );
922 gradTxieta2.Display();
924 double nxieta=gradTxyz.Norm();
926 cout <<
"nxieta=" << nxieta << endl;
930 double txieta=gradTxieta2[0]*tb+gradTxieta2[1]*tc;
932 cout <<
"txieta=" << txieta << endl;
937 double calpha=
fdiv ( v*txieta,nxieta );
939 cout <<
"calpha=" << calpha << endl;
946 else if ( calpha<-1.0 )
951 double ddd=
fdiv ( calpha*rho0,
sqrt ( 1-calpha*calpha ) );
953 cout <<
"ddd=" << ddd << endl;
955 gradTxyz.Normalize();
963 Minv.Mult ( gradTxyz,gradTxieta2 );
965 gradTxieta2.Display();
969 double xi=gradTxieta2[0];
970 double eta=gradTxieta2[1];
974 cout <<
"xi=" << xi <<
" eta=" << eta<< endl;
980 int t=
Solve_dt2d ( bx,by,bz,cx,cy,cz,dx,dy,dz,bt,ct,v,dt,ttt ) +1;
988 int t=
Solve_dt2d ( ax,ay,az,cx,cy,cz,dx,dy,dz,at,ct,v,dt,beta ) +1;
995 int t=
Solve_dt2d ( ax,ay,az,bx,by,bz,dx,dy,dz,at,bt,v,dt,alpha ) +1;
1000 td=
dt3d ( xi,eta,xb,yb,zb,xc,yc,zc,xd,yd,zd,tb,tc,v );
1013 int MG_FAST_MARCHING::val3d (
double ax,
double ay,
double az,
double bx,
double by,
double bz,
double cx,
double cy,
double cz,
double dx,
double dy,
double dz,
double at,
double bt,
double ct,
double v,
double& dt,
double &alpha,
double &beta )
1015 int res=
Solve_dt3d ( ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz,at,bt,ct,v,dt,alpha,beta );