sandbox/jmf/Hodge/hodge.c

    Test Hodge decomposition

    Two cases are tested

    • Case 1 from ‘Décomposition de Hodge-Helmholtz discrète’ A. Lemoine et al., 21ème Congrès Français de Mécanique, 2013. The field is composed of vortex and sinks/sources, the 2 dimensional vector U=(u,v) is \displaystyle u = \sin(\pi x) \cos(\pi y) + \cos(\pi x) \sin(\pi y) \displaystyle v = \cos(\pi x) \sin(\pi y) - \sin(\pi x) \cos(\pi y)
    • Case 2 : the 2D field comes from the scalar fonction -e^{-(x^2+y^2)} then \displaystyle u = (2x - 2 y) e^{-(x^2+y^2)} \displaystyle v = (2y+ 2 x ) e^{-(x^2+y^2)}

    We note that the Hodge decompostion needs a function with a compact support, then the boundary conditions are very important. In the Case 2 as -e^{-(x^2+y^2)} goes to zero rapidly we have not problem if L is large enough.

    #include "run.h"
    
    #include "hodge.h"
    
    int LEVEL = 6;
    int FLOW;
    
    vector u[];
    vector gradalpha[];
    vector gradbeta[];
    vector gam[];
    scalar func[];
    scalar alpha[];
    
    int main()
    {
      size (10);
     
      origin (-L0/2,-L0/2);
    
       init_grid (1 << LEVEL);
    
      for (FLOW = 1; FLOW <= 1; FLOW++)
        {
        run();
        }
    
    }
    
    
    event init (i=0)
    {    
        switch (FLOW) {
        case 1:
          foreach()
        {
           u.x[] = sin(pi*x)*cos(pi*y) + cos(pi*x)*sin(pi*y);
           u.y[] = cos(pi*x)*sin(pi*y) - sin(pi*x)*cos(pi*y);
        }
          break ;
         case 2:
           foreach()
        {
           u.x[] = 2.*x*exp(-(sq(x)+sq(y)));
           u.y[] = 2.*y*exp(-(sq(x)+sq(y)));
           u.x[] -= 2.*y*exp(-(sq(x)+sq(y)));
           u.y[] += 2.*x*exp(-(sq(x)+sq(y)));
        }
           break ;
        }
       
        boundary  ((scalar *){u});
    
        hodge(u,gradalpha,gradbeta,gam,alpha=func);
      
    }
    
    event print (t=end)
    {
    
      char name[80];
      sprintf (name, "log-case%d", FLOW);
      static FILE * fp = fopen (name, "w");
    
      foreach()
        {
       fprintf (fp,"%f %f %f %f %f %f %f %f %f %f \n",x,y,u.x[],u.y[],gradalpha.x[],
    	    gradalpha.y[], gradbeta.x[],gradbeta.y[],gam.x[],gam.y[]);
        }
      fclose(fp);
      
    
      
         
       if (FLOW==2)
         {
     	  foreach()
    	    printf("%f %f %f %f \n",x,y,func[],-exp(-(sq(x)+sq(y))));
         }
    }
    set multiplot layout 2,2 rowsfirst
    a = 2
    scale = 10
    file = "log-case1"
    # --- GRAPH a
    plot [-a:a]  [-a:a] file  u 1:2:($3/scale):($4/scale) with vect t "original"
    # --- GRAPH b
    plot [-a:a]  [-a:a]  file u 1:2:($5/scale):($6/scale) with vect  t "rot = 0"
    # --- GRAPH c
    plot [-a:a]  [-a:a] file u 1:2:($7/scale):($8/scale) with vect  t "div = 0"
    # --- GRAPH d
    plot [-a:a]  [-a:a] file u 1:2:(($5+$7)/scale):(($6+$8)/scale) with vect  t "reconstruction"
    #plot [-a:a]  [-a:a] file u 1:2:($9/scale):($10/scale) with vect 
    unset multiplot
    (script)

    (script)