Nstrophy/src/init.c

105 lines
1.8 KiB
C

#include "init.h"
#include "navier-stokes.h"
#include "io.h"
#include <stdlib.h>
#include <math.h>
// random initial condition
int init_random (
_Complex double* u0,
double init_en,
int K1,
int K2,
double L,
int seed,
bool irreversible
){
int kx,ky;
double rescale;
double x,y;
srand(seed);
// random init (set half, then the other half are the conjugates)
for(kx=0;kx<=K1;kx++){
for(ky=-K2;ky<=K2;ky++){
if (kx!=0 || ky>0){
x=-0.5+((double) rand())/RAND_MAX;
y=-0.5+((double) rand())/RAND_MAX;
u0[klookup_sym(kx,ky,K2)]=x+y*I;
}
}
}
if (irreversible) {
// fix the energy
rescale=compute_energy(u0, K1, K2);
} else {
// fix the enstrophy
rescale=compute_enstrophy(u0, K1, K2, L);
}
for(kx=0;kx<=K1;kx++){
for(ky=-K2;ky<=K2;ky++){
u0[klookup_sym(kx,ky,K2)]=u0[klookup_sym(kx,ky,K2)]*sqrt(init_en/rescale);
}
}
return 0;
}
// Gaussian initial condition
int init_gaussian (
_Complex double* u0,
double init_en,
int K1,
int K2,
double L,
bool irreversible
){
int kx,ky;
double rescale;
for(kx=0;kx<=K1;kx++){
for(ky=-K2;ky<=K2;ky++){
u0[klookup_sym(kx,ky,K2)]=(kx*kx+ky*ky)*exp(-(kx*kx+ky*ky));
}
}
if (irreversible) {
// fix the energy
rescale=compute_energy(u0, K1, K2);
} else {
// fix the enstrophy
rescale=compute_enstrophy(u0, K1, K2, L);
}
for(kx=0;kx<=K1;kx++){
for(ky=-K2;ky<=K2;ky++){
u0[klookup_sym(kx,ky,K2)]=u0[klookup_sym(kx,ky,K2)]*sqrt(init_en/rescale);
}
}
return 0;
}
// Initialize from file
// txt input
int init_file_txt (
_Complex double* u0,
int K1,
int K2,
FILE* initfile
){
read_u(u0, K1, K2, initfile);
return 0;
}
// binary input
int init_file_bin (
_Complex double* u0,
int K1,
int K2,
FILE* initfile
){
read_u_bin(u0, K1, K2, initfile);
return 0;
}