/* h = 0.0333 dz = 0.000333 s[2] = 0.00425 s[1] = 0.00190 s[0] = 0.00048 s[-1]= 0.00000 s[-2]= 0.00000 dzdzdzS = (0.00425 - .0038)/2dzdzdz = .0002 / dzdzdz = large ! */ /*** todo : STEPS_R >> STEPS_Z so that dr = dz roughly (i.e. don't make them constants) make max_megs the cli arg ***/ /* } * { */ /*** * * note : all numbers are in cm, sec. and gm. * ***/ #include #include #include #define smartfree(ptr) if ( ptr == NULL ) ; else { free(ptr); ptr = NULL; } typedef unsigned long ulong; #ifndef PI #define PI ((double)3.14159265358979323846) #endif /** constants : **/ #define PAD (2) #define GRAVITY (980.0) #define CHART_CNT (20) #define NUM_STEPS_X (200) #define NUM_STEPS_T (100) /* } * { */ /** the world: **/ /* h is height[r] * s is stream function of [r][z] * p is pressure of [r][z] **/ double *h,**s,**p; //new double *h1=NULL,**s1=NULL,**p1=NULL; //allocs double *h2=NULL,**s2=NULL,**p2=NULL; double base_dr,base_dz,dt; /* } * { */ /** parameters: **/ const double flux = 20; // cm*cm*cm/s const double jetr = 0.2; // cm const double visc = 0.01; // water, gm*cm*cm/s /** computed secondary parameters: **/ double Re,Fr; double jetv,rjump; double rmin,rmax,hseed; /* } * { */ /** protos **/ void conditionBoundary(void); void conditionTimeZero(void); void solveNextTmaster(void); void solveNextT(void); void saveInfoHeader(FILE *fp,char *name,int length,int timestep); void saveVector(char *name,double *vector,int length,int timestep); void saveMatrix(char *name,double **matrix,int length,int step,int timestep); void saveVelocities(int time); double *vector(int size); double **matrix(int sizex,int sizey); void freevector(double *v); void freematrix(double **m); void cleanup(char *mess,int ret); /*** do it ***/ /* } * { */ int main(int argc,char *argv[]) { /** flux,jetr,visc are the seeds; find other init-values **/ jetv = flux/(PI*jetr*jetr); Re = jetv * jetr / visc; Fr = jetv / sqrt(GRAVITY*jetr); printf("Reynolds : %f , Froude: %f\n",Re,Fr); rjump = pow(Re,1.0/3.0); rjump *= jetr; // prediction from trivial Godwin rmin = jetr * 3.0; rmax = rjump * 3.0; hseed = flux / (2*PI*rmin*jetv); printf("Godwin rjump : %f\n",rjump); printf("rmin: %f , rmax: %f\n",rmin,rmax); base_dr = (rmax - rmin) / NUM_STEPS_X; base_dz = hseed * 2.0 / NUM_STEPS_X; dt = (base_dr / jetv) / 10.0; /** do (dr/jetv) to make a dt in the right units then take 1/10 cuz dt << dr **/ h1 = vector(NUM_STEPS_X); s1 = matrix(NUM_STEPS_X,NUM_STEPS_X); p1 = matrix(NUM_STEPS_X,NUM_STEPS_X); h2 = vector(NUM_STEPS_X); s2 = matrix(NUM_STEPS_X,NUM_STEPS_X); p2 = matrix(NUM_STEPS_X,NUM_STEPS_X); h = h1; s = s1; p = p1; conditionTimeZero(); solveNextTmaster(); cleanup("exit",0); return 0; } void cleanup(char *mess,int ret) { freevector(h1); freevector(h2); freematrix(s1); freematrix(s2); freematrix(p1); freematrix(p2); fprintf(stderr,"%s\n",mess); exit(ret); } /* } * { */ void solveNextTmaster(void) { int i; i = 0; for(;;) { saveVector("height",h,NUM_STEPS_X,i); saveMatrix("pressure",p,NUM_STEPS_X,10,i); saveMatrix("streamF",s,NUM_STEPS_X,10,i); saveVelocities(i); printf("time step # %d\n",i); if ( ++i == NUM_STEPS_T ) break; conditionBoundary(); solveNextT(); } } /* } * { */ /*********** * * solve next t * * starts with h,p,s * * returns h,p,s at new t * *************/ #define dzS(r,z) ((s[r][z+1] - s[r][z-1])/(2.0*dz)) #define drS(r,z) ((s[r+1][z] - s[r-1][z])/(2.0*dr)) #define drdzS(r,z) ( (s[r+1][z+1] - s[r+1][z-1] - s[r-1][z+1] + s[r-1][z-1])/(2.0*dr*dz) ) #define dzdzS(r,z) ( (s[r][z+1]+s[r][z-1]-2*s[r][z])/(dz*dz) ) #define drdrS(r,z) ( (s[r+1][z]+s[r-1][z]-2*s[r][z])/(dr*dr) ) #define drP(r,z) ((p[r+1][z] - p[r-1][z])/(2.0*dr)) #define lapS(r,z) ( drdrS(r,z) + dzdzS(r,z) ) #define drdzdzS(r,z) ( (s[r+1][z+1] - s[r+1][z-1] - s[r-1][z+1] + s[r-1][z-1])/(2.0*dr*dz) ) #define dzdzdzS(r,z) (( s[r][z+2] - s[r][z-2] - 2*(s[r][z+1] - s[r][z-1]))/(2.0*dz*dz*dz)) #define drdrdrS(r,z) (( s[r+2][z] - s[r-2][z] - 2*(s[r+1][z] - s[r-1][z]))/(2.0*dr*dr*dr)) /* } * { */ void solveNextT(void) { int ri,zi,zmax; double r,z,rest; double *nh,**ns,**np; double delta,temp; double drLapS,dzLapS,drdtS,dzdtS; double dr,dz; if ( h == h1 ) { nh = h2; ns = s2; np = p2; } else { nh = h1; ns = s1; np = p1; } /** first find s at new t **/ for(ri=0;ri= NUM_STEPS_X ) { cleanup("double initial height found!",0); } for(zi=0;zi<=zmax;zi++) { z = zi * base_dz; temp = z + base_dz; dz = temp - z; { double dzdzdzS,dzdrdrS; dzdzdzS = dzdzdzS(ri,zi); dzdrdrS = (drdrS(ri,zi+1) - drdrS(ri,zi-1))/(dz+dz); dzLapS = dzdzdzS + dzdrdrS; } delta = (1/r)*( dzS(ri,zi)*dzS(ri,zi)/r - dzS(ri,zi)*drdzS(ri,zi) - drS(ri,zi)*dzdzS(ri,zi)) - drP(ri,zi) + (visc/r)*dzLapS; dzdtS = s[ri][zi+1] - s[ri][zi-1] + 2*dz*dt * delta; ns[ri][zi+1] = ns[ri][zi-1] + dzdtS; } rest = ns[ri][zmax]; for(zi=zmax+1;zi NUM_STEPS_X ) zmax = NUM_STEPS_X; for(zi=0;zi NUM_STEPS_X ) zmax = NUM_STEPS_X; for(zi=0;zi NUM_STEPS_X ) zmax = NUM_STEPS_X; for(zi=0;zi