file: Nektar2d/src/drive.c
/*---------------------------------------------------------------------------*
* RCS Information *
* *
* $Source:
* $Revision:
* $Date:
* $Author:
* $State:
*---------------------------------------------------------------------------*/
// tcew done
#include <stdio.h>
#include <time.h>
#include "nektar.h"
static int Je; /* Externals */
static double dt, Re;
void MakeF (Domain *omega, ACTION act, SLVTYPE slvtype); //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?); ACTION: nekcomp.h(?), nektar.h(?)
static void StartUp (Domain *); //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?)
void switch_hj(Element_List *EL, double **hj);
void Bsystem_mem_free(Bsystem *Ubsys, Element_List *U);
void P_solve(Element_List *U, Element_List *Uf,Bndry *Ubc,Bsystem *Ubsys,SolveType Stype);
void V_solve(Element_List *U, Element_List *Uf,Bndry *Ubc,Bsystem *Ubsys, double *us, SolveType Stype,int step);
void S_solve(Domain *Omega); //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?)
#if 1
#define Timing(s) \
fprintf(stdout,"%s Took %g seconds\n",s,(clock()-st)/cps); \ //OVERLOAD CALL: cps: nekcomp.h(?), Solve_Stokes.c(?)
st = clock();
#else
#define Timing(s) \
/* Nothing */
#endif
int Nek_Fullcg = 0;
main(int argc, char *argv[]){
Domain *Omega; /* Solution Domain */ //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?); Domain: nekcomp.h(?), nektar.h(?)
int step, nsteps; /* Discrete time (step) */
double time = 0.0; /* Continuous time */
ACTION WaveProp; /* Convective form */ //OVERLOAD CALL: ACTION: nekcomp.h(?), nektar.h(?)
SLVTYPE SolveType; /* Solver type */
double begin_clock;
double st, cps = (double)CLOCKS_PER_SEC; //OVERLOAD CALL: cps: nekcomp.h(?), Solve_Stokes.c(?)
#ifdef DEBUG
/* mallopt(M_DEBUG,1); */
init_debug();
#endif
Omega = PreProcess(argc,argv);
Nek_Fullcg = option("FullCG");
time = dparam("STARTIME");
nsteps = iparam("NSTEPS");
WaveProp = (ACTION) iparam("EQTYPE"); //OVERLOAD CALL: ACTION: nekcomp.h(?), nektar.h(?)
SolveType = (SLVTYPE) iparam("SLVTYPE");
Je = iparam("INTYPE");
dt = dparam("DELT");
step = 0;
Re = 1./dparam("KINVIS");
StartUp (Omega);
#if defined(WANNIER)||defined(WOMERSLEY)
dparam_set("TIME",time);
Omega->U->Terror("u");
Omega->V->Terror("v");
#else
Omega->U->Terror(Omega->soln[0]);
Omega->V->Terror(Omega->soln[1]);
Omega->P->Terror(Omega->soln[2]);
#endif
/*------------------------------------------------------------------*
* Main Integration Loop *
*------------------------------------------------------------------*/
begin_clock = (double) clock();
switch(SolveType){
case Splitting:
while (step < nsteps) {
set_order(((step+1 < Je)? step+1: Je));
st = clock();
MakeF (Omega, Prep, SolveType);
Timing("Prep......."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
MakeF (Omega, WaveProp, SolveType);
Timing("WavePropo.."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
Integrate_SS(Je, dt, Omega->U, Omega->Uf, Omega->u, Omega->uf);
Integrate_SS(Je, dt, Omega->V, Omega->Vf, Omega->v, Omega->vf);
Timing("Integrate.."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
MakeF (Omega, Pressure, SolveType);
Timing("Pressure..."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
P_solve (Omega->P,Omega->Pf,Omega->Pbc,Omega->Pressure_sys,Helm);
Timing("P_solve...."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
MakeF (Omega, Viscous, SolveType);
Timing("Viscous...."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
V_solve(Omega->U,Omega->Uf,Omega->Ubc,Omega->Usys,
Omega->us[0],Helm,step);
V_solve(Omega->V,Omega->Vf,Omega->Vbc,Omega->Vsys,
Omega->vs[0],Helm,step);
Timing("V_solve...."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
MakeF (Omega, Post, SolveType);
Timing("Post......."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
#ifdef WOMERSLEY
dparam_set("TIME",time+dt);
#endif
Analyser(Omega, ++step, (time += dt));
Timing("Analyser..."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
}
break;
case StokesSlv:
while (step < nsteps) {
set_order_CNAB(((step+1 < Je)? step+1: Je));
st = clock();
MakeF (Omega, Prep, SolveType);
Timing("Prep......."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
MakeF (Omega, WaveProp, SolveType);
Timing("WavePropo.."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
if((WaveProp != StokesS)&&(WaveProp != Oseen)){
Integrate_CNAB(Je, dt, Omega->U, Omega->Uf, Omega->u, Omega->uf);
Integrate_CNAB(Je, dt, Omega->V, Omega->Vf, Omega->v, Omega->vf);
Timing("Integrate.."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
MakeF(Omega, StokesForce, SolveType);
Timing("StokesFce.."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
}
S_solve(Omega);
Timing("StokesSlv.."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
if((WaveProp != StokesS)&&(WaveProp != Oseen)){
MakeF (Omega, Post, SolveType);
Timing("Post......."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
}
#ifdef WOMERSLEY
dparam_set("TIME",time+dt);
#endif
Analyser(Omega, ++step, (time += dt));
Timing("Analyser..."); //OVERLOAD CALL: Timing: Solve_Stokes.c(?), nekcomp.h(?), Solve_Stokes.c(?), nekcomp.h(?), drive.c(?), drive.c(?)
}
break;
}
printf("User time of solver (seconds): %lf \n",
(clock()-begin_clock)/(double)CLOCKS_PER_SEC);
PostProcess(Omega, step, time);
exit(0);
}
void P_solve(Element_List *U, Element_List *Uf,
Bndry *Ubc, Bsystem *Ubsys,SolveType Stype)
{
if(!Nek_Fullcg){
SetBCs (U,Ubc,Ubsys); //OVERLOAD CALL: SetBCs: Solve.c(?), Solve.c(?)
Solve (U,Uf,Ubc,Ubsys,Stype);
}
else{
Solve_CG(U,Uf,Ubc,Ubsys,Stype);
}
}
void V_solve(Element_List *U, Element_List *Uf,
Bndry *Ubc, Bsystem *Ubsys, double *us, SolveType Stype, int step){
if(step && step < Je){
int k;
for(k=0;k<U->nel;++k)
Ubsys->lambda[k].d = Re*getgamma()/dt; //OVERLOAD CALL: getgamma: Integrate.c(?), Integrate.c(?)
if(Ubc&&Ubc->DirRHS){
free(Ubc->DirRHS);
Ubc->DirRHS = (double*) 0;
}
if(U->fhead->type == 'u' || option("REFLECT")){
Bsystem_mem_free(Ubsys, U);
GenMat(U,Ubc,Ubsys,Ubsys->lambda,Helm);
}
DirBCs(U,Ubc,Ubsys,Helm);
}
if(option("tvarying")){
Bndry *Bc;
for(Bc=Ubc;Bc;Bc=Bc->next)
Bc->elmt->update_bndry(Bc); //OVERLOAD CALL: update_bndry: Boundary.c(Tri), Boundary.c(Quad), Boundary.c(Tet), Boundary.c(Pyr), Boundary.c(Prism), Boundary.c(Hex), Boundary.c(Element)
}
dcopy(U->hjtot, us, 1, U->base_hj, 1);
if(!Nek_Fullcg){
SetBCs (U,Ubc,Ubsys); //OVERLOAD CALL: SetBCs: Solve.c(?), Solve.c(?)
Solve (U,Uf,Ubc,Ubsys,Stype);
}
else{
Solve_CG(U,Uf,Ubc,Ubsys,Stype);
}
}
void S_solve(Domain *Omega){ //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?)
Element_List *V[DIM+1], *Vf[DIM+1];
Bndry *Vbc[DIM];
Bsystem *Vbsys[DIM+1];
V[0] = Omega->U;
V[1] = Omega->V;
V[2] = Omega->P;
Vf[0] = Omega->Uf;
Vf[1] = Omega->Vf;
Vf[2] = Omega->Pf;
Vbsys[0] = Omega->Usys;
Vbsys[1] = Omega->Vsys;
Vbsys[2] = Omega->Pressure_sys;
Vbc[0] = Omega->Ubc;
Vbc[1] = Omega->Vbc;
dcopy(Omega->U->hjtot, Omega->us[0], 1, Omega->U->base_hj, 1);
dcopy(Omega->V->hjtot, Omega->vs[0], 1, Omega->V->base_hj, 1);
SetBCs (Omega->U,Omega->Ubc,Omega->Usys); //OVERLOAD CALL: SetBCs: Solve.c(?), Solve.c(?)
SetBCs (Omega->V,Omega->Vbc,Omega->Vsys); //OVERLOAD CALL: SetBCs: Solve.c(?), Solve.c(?)
Solve_Stokes (V,Vf,Vbc,Vbsys);
}
void MakeF(Domain *omega, ACTION act, SLVTYPE slvtype){ //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?); ACTION: nekcomp.h(?), nektar.h(?)
Element_List *U = omega->U, *V = omega->V,
*Uf = omega->Uf, *Vf = omega->Vf,
*P = omega->P, *Pf = omega->Pf;
switch (act) {
case Prep: /* put fields in physical space for waveprop */
U->Trans(U,J_to_Q); //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex)
V->Trans(V,J_to_Q); //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex)
break;
case StokesForce:
/* at present theta factor is dealt with in the H_Integrate.C */
/*dsmul(U->htot,1/dt,U->base_h,1,Uf->base_h,1);
dsmul(V->htot,1/dt,V->base_h,1,Vf->base_h,1); */
U->Iprod(Uf); //OVERLOAD CALL: Iprod: InnerProd.c(Element), Element_List.c(Element_List), InnerProd.c(Tri), InnerProd.c(Quad), InnerProd.c(Tet), InnerProd.c(Pyr), InnerProd.c(Prism), InnerProd.c(Hex)
V->Iprod(Vf); //OVERLOAD CALL: Iprod: InnerProd.c(Element), Element_List.c(Element_List), InnerProd.c(Tri), InnerProd.c(Quad), InnerProd.c(Tet), InnerProd.c(Pyr), InnerProd.c(Prism), InnerProd.c(Hex)
dsmul(Uf->hjtot,1/dt,Uf->base_hj,1,Uf->base_hj,1);
dsmul(Vf->hjtot,1/dt,Vf->base_hj,1,Vf->base_hj,1);
break;
case Rotational:
VxOmega (omega);
goto AddForcing;
case Convective:
VdgradV (omega);
goto AddForcing;
case Oseen: case Stokes: case StokesS:
StokesBC (omega);
AddForcing: {
double fx = dparam("FFX");
double fy = dparam("FFY");
#ifdef WOMERSLEY
fx = -dparam("WOMA")*sin(dparam("WOMW")*dparam("TIME"));
dsadd(U->htot,fx, Uf->base_h, 1, Uf->base_h, 1);
#else
if(fx)
dsadd(U->htot, fx, Uf->base_h, 1, Uf->base_h, 1);
if(fy)
dsadd(U->htot, fy, Vf->base_h, 1, Vf->base_h, 1);
if(omega->ForceFuncs){
dvadd(U->htot, omega->ForceFuncs[0], 1, Uf->base_h, 1, Uf->base_h, 1);
dvadd(V->htot, omega->ForceFuncs[1], 1, Vf->base_h, 1, Vf->base_h, 1);
}
#endif
if(slvtype == Splitting) SetPBCs(omega);
break;
}
case Pressure: {
double dtinv = 1./dt;
double *nul= (double*)0;
static double *ux = (double*)0;
if(!ux)
ux = dvector(0,2*U->htot-1);
double *vy = ux+U->htot;
U->Grad_d( ux, nul, nul, 'x'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex)
V->Grad_d(nul, vy, nul, 'y'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex)
dvadd(U->htot, ux, 1, vy, 1, Pf->base_h, 1);
Pf->Set_state('p');
Pf->Iprod(Pf); //OVERLOAD CALL: Iprod: InnerProd.c(Element), Element_List.c(Element_List), InnerProd.c(Tri), InnerProd.c(Quad), InnerProd.c(Tet), InnerProd.c(Pyr), InnerProd.c(Prism), InnerProd.c(Hex)
dscal(Pf->hjtot, dtinv, Pf->base_hj, 1);
break;
}
case Viscous: {
double dtinv = 1/dt;
P->Trans(P, J_to_Q); //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex)
P->Set_state('p');
P->Grad_d (Uf->base_h,Vf->base_h,(double*)0,'a'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex)
P->Set_state('t');
daxpy(U->htot, -dtinv, U->base_h, 1, Uf->base_h, 1);
Uf->Set_state('p');
Uf->Iprod(Uf); //OVERLOAD CALL: Iprod: InnerProd.c(Element), Element_List.c(Element_List), InnerProd.c(Tri), InnerProd.c(Quad), InnerProd.c(Tet), InnerProd.c(Pyr), InnerProd.c(Prism), InnerProd.c(Hex)
dscal(U->hjtot, Re, Uf->base_hj, 1);
dcopy(U->hjtot, *omega->us, 1, U->base_hj, 1);
daxpy(V->htot, -dtinv, V->base_h, 1, Vf->base_h, 1);
Vf->Set_state('p');
Vf->Iprod(Vf); //OVERLOAD CALL: Iprod: InnerProd.c(Element), Element_List.c(Element_List), InnerProd.c(Tri), InnerProd.c(Quad), InnerProd.c(Tet), InnerProd.c(Pyr), InnerProd.c(Prism), InnerProd.c(Hex)
dscal(V->hjtot, Re, Vf->base_hj, 1);
dcopy(U->hjtot, *omega->vs, 1, V->base_hj, 1);
break;
}
case Post: {
int Nm = U->hjtot;
if((slvtype == StokesSlv)){
double theta = dparam("THETA");
dsvtvp(Nm,-theta,*omega->us,1,U->base_hj,1,U->base_hj,1);
dscal (Nm,1.0/(1.0-theta),U->base_hj,1);
dsvtvp(Nm,-theta,*omega->vs,1,V->base_hj,1,V->base_hj,1);
dscal (Nm,1.0/(1.0-theta),V->base_hj,1);
}
dcopy(Nm, U->base_hj, 1, *omega->us, 1);
dcopy(Nm, V->base_hj, 1, *omega->vs, 1);
break;
}
default:
error_msg(MakeF--unknown type of action); //OVERLOAD CALL: error_msg: gen_utils.h(?), hotel.h(?)
break;
}
return;
}
/* Do initial time step assuming for case where startup field is in physical *
* space or copy V field to Vs if it is a restart */
static void StartUp(Domain *omega){ //OVERLOAD CALL: Domain: nekcomp.h(?), nektar.h(?)
if(omega->U->fhead->state == 'p'){
omega->U->Trans(omega->U,Q_to_J); //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex)
SetBCs (omega->U,omega->Ubc,omega->Usys); //OVERLOAD CALL: SetBCs: Solve.c(?), Solve.c(?)
omega->V->Trans(omega->V,Q_to_J); //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex)
SetBCs (omega->U,omega->Ubc,omega->Usys); //OVERLOAD CALL: SetBCs: Solve.c(?), Solve.c(?)
}
dcopy(omega->U->hjtot, omega->U->base_hj, 1, *omega->us, 1);
dcopy(omega->V->hjtot, omega->V->base_hj, 1, *omega->vs, 1);
omega->U->Set_state('t');
omega->V->Set_state('t');
omega->P->Set_state('t');
}
void switch_hj(Element_List *EL, double **hj){
double *d = EL->base_hj;
EL->Mem_shift(EL->base_h, *hj); //OVERLOAD CALL: Mem_shift: Element_List.c(Element_List), Memory.c(Tri), Memory.c(Quad), Memory.c(Tet), Memory.c(Pyr), Memory.c(Prism), Memory.c(Hex), Memory.c(Element)
*hj = d;
}
C++ to HTML Conversion by ctoohtml