From 21e8dcdb8a4b975378dd453c6e610e32664c14cc Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Sat, 1 Feb 2025 14:12:54 -0500 Subject: [PATCH] In RK algorithms: do not use kx,ky, use i --- src/navier-stokes.c | 269 +++++++++++++++++--------------------------- 1 file changed, 101 insertions(+), 168 deletions(-) diff --git a/src/navier-stokes.c b/src/navier-stokes.c index 0d32e89..253f1bf 100644 --- a/src/navier-stokes.c +++ b/src/navier-stokes.c @@ -23,6 +23,8 @@ limitations under the License. #include #include +#define USIZE (K1*(2*K2+1)+K2) + // compute solution as a function of time int uk( int K1, @@ -353,30 +355,30 @@ int ns_init_tmps( unsigned int algorithm ){ // velocity field - *u=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); + *u=calloc(USIZE,sizeof(_Complex double)); // allocate tmp vectors for computation if(algorithm==ALGORITHM_RK2){ - *tmp1=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp2=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); + *tmp1=calloc(USIZE,sizeof(_Complex double)); + *tmp2=calloc(USIZE,sizeof(_Complex double)); } else if (algorithm==ALGORITHM_RK4){ - *tmp1=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp2=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp3=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); + *tmp1=calloc(USIZE,sizeof(_Complex double)); + *tmp2=calloc(USIZE,sizeof(_Complex double)); + *tmp3=calloc(USIZE,sizeof(_Complex double)); } else if (algorithm==ALGORITHM_RKF45 || algorithm==ALGORITHM_RKDP54){ - *tmp1=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp2=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp3=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp4=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp5=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp6=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp7=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); + *tmp1=calloc(USIZE,sizeof(_Complex double)); + *tmp2=calloc(USIZE,sizeof(_Complex double)); + *tmp3=calloc(USIZE,sizeof(_Complex double)); + *tmp4=calloc(USIZE,sizeof(_Complex double)); + *tmp5=calloc(USIZE,sizeof(_Complex double)); + *tmp6=calloc(USIZE,sizeof(_Complex double)); + *tmp7=calloc(USIZE,sizeof(_Complex double)); } else if (algorithm==ALGORITHM_RKBS32){ - *tmp1=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp2=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp3=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp4=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); - *tmp5=calloc(K1*(2*K2+1)+K2,sizeof(_Complex double)); + *tmp1=calloc(USIZE,sizeof(_Complex double)); + *tmp2=calloc(USIZE,sizeof(_Complex double)); + *tmp3=calloc(USIZE,sizeof(_Complex double)); + *tmp4=calloc(USIZE,sizeof(_Complex double)); + *tmp5=calloc(USIZE,sizeof(_Complex double)); } else { fprintf(stderr,"bug: unknown algorithm: %u, contact ian.jauslin@rutgers,edu\n",algorithm); }; @@ -462,7 +464,7 @@ int copy_u( ){ int i; - for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp3[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+delta/6*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp2[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+delta/2*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp3[klookup_sym(kx,ky,K2)]+=delta/3*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp2[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+delta/2*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp3[klookup_sym(kx,ky,K2)]+=delta/3*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp2[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+delta*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]=tmp3[klookup_sym(kx,ky,K2)]+delta/6*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]*=sqrt(target_en/en); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp2[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+delta/2*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]+=delta*tmp1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]*=sqrt(target_en/en); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)/4*k1[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(3./32*k1[klookup_sym(kx,ky,K2)]+9./32*k2[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(1932./2197*k1[klookup_sym(kx,ky,K2)]-7200./2197*k2[klookup_sym(kx,ky,K2)]+7296./2197*k3[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(439./216*k1[klookup_sym(kx,ky,K2)]-8*k2[klookup_sym(kx,ky,K2)]+3680./513*k3[klookup_sym(kx,ky,K2)]-845./4104*k4[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(-8./27*k1[klookup_sym(kx,ky,K2)]+2*k2[klookup_sym(kx,ky,K2)]-3544./2565*k3[klookup_sym(kx,ky,K2)]+1859./4104*k4[klookup_sym(kx,ky,K2)]-11./40*k5[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - // u - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(25./216*k1[klookup_sym(kx,ky,K2)]+1408./2565*k3[klookup_sym(kx,ky,K2)]+2197./4104*k4[klookup_sym(kx,ky,K2)]-1./5*k5[klookup_sym(kx,ky,K2)]); - // U: save to k6, which is no longer needed - k6[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(16./135*k1[klookup_sym(kx,ky,K2)]+6656./12825*k3[klookup_sym(kx,ky,K2)]+28561./56430*k4[klookup_sym(kx,ky,K2)]-9./50*k5[klookup_sym(kx,ky,K2)]+2./55*k6[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]=tmp[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]*=sqrt(target_en/en); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)/2*(*k1)[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(3./4*k2[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(2./9*(*k1)[klookup_sym(kx,ky,K2)]+1./3*k2[klookup_sym(kx,ky,K2)]+4./9*k3[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - // U: store in k3, which is no longer needed - k3[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(7./24*(*k1)[klookup_sym(kx,ky,K2)]+1./4*k2[klookup_sym(kx,ky,K2)]+1./3*k3[klookup_sym(kx,ky,K2)]+1./8*(*k4)[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]=tmp[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]*=sqrt(target_en/en); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)/5*(*k1)[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(3./40*(*k1)[klookup_sym(kx,ky,K2)]+9./40*(*k2)[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(44./45*(*k1)[klookup_sym(kx,ky,K2)]-56./15*(*k2)[klookup_sym(kx,ky,K2)]+32./9*k3[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(19372./6561*(*k1)[klookup_sym(kx,ky,K2)]-25360./2187*(*k2)[klookup_sym(kx,ky,K2)]+64448./6561*k3[klookup_sym(kx,ky,K2)]-212./729*k4[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(9017./3168*(*k1)[klookup_sym(kx,ky,K2)]-355./33*(*k2)[klookup_sym(kx,ky,K2)]+46732./5247*k3[klookup_sym(kx,ky,K2)]+49./176*k4[klookup_sym(kx,ky,K2)]-5103./18656*k5[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - // tmp computed here is the step - tmp[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(35./384*(*k1)[klookup_sym(kx,ky,K2)]+500./1113*k3[klookup_sym(kx,ky,K2)]+125./192*k4[klookup_sym(kx,ky,K2)]-2187./6784*k5[klookup_sym(kx,ky,K2)]+11./84*k6[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - // U: store in k6, which is not needed anymore - k6[klookup_sym(kx,ky,K2)]=u[klookup_sym(kx,ky,K2)]+(*delta)*(5179./57600*(*k1)[klookup_sym(kx,ky,K2)]+7571./16695*k3[klookup_sym(kx,ky,K2)]+393./640*k4[klookup_sym(kx,ky,K2)]-92097./339200*k5[klookup_sym(kx,ky,K2)]+187./2100*k6[klookup_sym(kx,ky,K2)]+1./40*(*k2)[klookup_sym(kx,ky,K2)]); - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]=tmp[klookup_sym(kx,ky,K2)]; - } + for(i=0;i0 ? -K2 : 1);ky<=K2;ky++){ - u[klookup_sym(kx,ky,K2)]*=sqrt(target_en/en); - } + for(i=0;i