src/test/rayleigh-plesset.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    struct RPdata {
      double pliq, rhol, p0, gamma, sigma, R0, visc, cson;
    } RPdata;
    
    struct RK4data {
     double t0, h;
     double * y;
     int nvars; 
     void * data; 
    };
    
    static void RK4( void (*f)(double ti, double * y, void * data, double * dydt), double t0, double h, double * y, int nvars, void * data) 
    {
    
    /* INPUTS 
    */
       double k1[nvars], k2[nvars], k3[nvars], k4[nvars], ytmp[nvars];
    
       f(t0,y,data,k1);
    
       for (int j=0; j<nvars; j++) 
         ytmp[j] = y[j] + 0.5*k1[j]*h;
       f(t0+0.5*h,ytmp,data,k2);
    
       for (int j=0; j<nvars; j++) 
         ytmp[j] = y[j] + 0.5*k2[j]*h;
       f(t0+0.5*h,ytmp,data, k3);
    
       for (int j=0; j<nvars; j++) 
         ytmp[j] = y[j] + k3[j]*h;
       f(t0 + h,ytmp,data, k4);
    
       for (int j=0; j<nvars; j++)
          y[j] += (k1[j]+2*k2[j]+2*k3[j]+k4[j])/6 * h;
    
    }
    
    void RP (double ti, double * y, void * data, double * dydt){
    
    //y[1] the radius R double dote
    //y[2] velocity at the interface R dote
    //
      struct RPdata * RPd = data;
    
      double pbub = RPd->p0*pow(RPd->R0/y[0],(3.*RPd->gamma));
      double pliqInt = pbub - 2.*RPd->sigma/y[0] - 4.*RPd->visc*y[1]/y[0];
      dydt[0] = y[1];
      dydt[1] = ((pliqInt - RPd->pliq) / RPd->rhol - 3.*pow(y[1],2.)/2.)/y[0];  
    
    }
    
    void KM (double ti, double * y, void * data, double * dydt){
    
    //y[1] the radius R double dote
    //y[2] velocity at the interface R dote
    //
      struct RPdata * RPd = data;
    
      double pbub = RPd->p0*pow(RPd->R0/y[0],(3.*RPd->gamma));
      double pliqInt = pbub - 2.*RPd->sigma/y[0] - 4.*RPd->visc*y[1]/y[0];
    
      double k1 = 1.-y[1]/RPd->cson + 4*RPd->visc/RPd->rhol/RPd->cson/y[0];
      double Cfactor = y[1]/RPd->cson*(pow(0.5*y[1],2) - (pliqInt - RPd->pliq)/RPd->rhol - 3*RPd->gamma*pbub/RPd->rhol + 2*RPd->sigma/y[0]/RPd->rhol + 4*RPd->visc*y[1]/y[0]/RPd->rhol);
      dydt[0] = y[1];
      dydt[1] = ((pliqInt - RPd->pliq) / RPd->rhol - 3.*pow(y[1],2.)/2. + Cfactor )/y[0]/k1;  
    
    
    }
    
    
    
    void Integrate_RP (FILE * fp, double ti, double tend, void * data){
    
      struct RPdata * RPd = data;
    
      double y[2], yKM[2];
      y[0] = yKM[0] = RPd->R0;
      y[1] = yKM[1] =  0.;
    
      double dt = RPd->R0*sqrt(RPd->rhol/RPd->pliq)*1.e-3;
    
      for (double ti=0.; ti<=tend; ti+=dt) {
        RK4( RP,ti,dt,y,2, RPd );
        RK4( KM,ti,dt,yKM,2, RPd );
        fprintf(fp, "%g %g %g \n",ti, y[0], yKM[0]);
      }
    
    }