PDETOOLBOX
This block is an implementation of several numerical schemes (Finite Elements (1st and 2nd order), Finite Differences (1st and 2nd order), Finite Volumes (1st order)) to solve mono dimensional PDE (Partial Differential Equation) within SCICOS. The methematical framwork was restricts in PDEs linear scalars with maximum order 2 in time and space. The goal is to provide engineers and physicists with an easy to use toolbox in SCICOS that will let them graphically describe the PDE to be solved. A decision system selects the most efficient numerical scheme depending on the type of the PDE and runs the solvers.
Set PDE block parameters (IHM box) |
|
a and b |
(double) The two edges of the discretization field |
specification de l'EDP |
check box to select the PDE operators ai(x), bi(t) (i=1:7) are the operator coefficients type of PDE discriminant (constant or variable, in the later case, the sign should be given) |
Discretization methode |
choix (check box) : is the choice for the manual or the automatic mode type : in the manual mode we can give the method type (Finte differences, finite elements or finite volumes) degré : method degre (1 or 2 for the FD and FE methods, 1 for the FV method). Nombre de noeuds : to give the numbre of the nodal points |
Conditions initiales |
u(x,t0)=, du/dt at t0= : to give the initial conditions. |
Conditions aux limites |
type : two type of the boundray conditions are possible : Dirichlet or Neumann expressions : to give then boundray conditions expressions |
Points de mesures |
To give the list of mesurment points |
Name |
A getvalue box to give the block name's |
always active: yes
direct-feedthrough: no
zero-crossing: no
mode: no
number/sizes of inputs: -1 / -1
number/sizes of outputs: -1 / -1
number/sizes of activation inputs: 0 /
number/sizes of activation outputs: 0 /
continuous-time state: yes
discrete-time state: no
name of computational function: nom_implicite
SCI/EDP/macros/PDE.sci
#include "scicos_block.h" #include void exe_implicite(scicos_block *block,int flag) { double **inptr = block->inptr; double **outptr = block->outptr; double *x = block->x; int nx = block->nx; double *xd = block->xd; double *res = block->res; int property[10]; int i; double t = get_scicos_time(); if (flag == 0){ res[0]=inptr[2][0]-x[0]; res[1]=inptr[1][0]-(-81*x[0]+162*x[1]-81*x[2])*inptr[0][0]; res[2]=inptr[1][0]-(-81*x[1]+162*x[2]-81*x[3])*inptr[0][0]; res[3]=inptr[1][0]-(-81*x[2]+162*x[3]-81*x[4])*inptr[0][0]; res[4]=inptr[1][0]-(-81*x[3]+162*x[4]-81*x[5])*inptr[0][0]; res[5]=inptr[1][0]-(-81*x[4]+162*x[5]-81*x[6])*inptr[0][0]; res[6]=inptr[1][0]-(-81*x[5]+162*x[6]-81*x[7])*inptr[0][0]; res[7]=inptr[1][0]-(-81*x[6]+162*x[7]-81*x[8])*inptr[0][0]; res[8]=inptr[1][0]-(-81*x[7]+162*x[8]-81*x[9])*inptr[0][0]; res[9]=inptr[3][0]-x[9]; }else if (flag == 1){ /* la première sortie */ for (i=0;i<10;i++){ outptr[0][i]=x[i]; } /* la deuxième sortie */ outptr[1][0]=x[4]; outptr[1][1]=x[9]; }else if (flag == 4){ /* }else if (flag == 5){ */ }else if (flag == 7){ property[0]=-1; property[1]=-1; property[2]=-1; property[3]=-1; property[4]=-1; property[5]=-1; property[6]=-1; property[7]=-1; property[8]=-1; property[9]=-1; set_pointer_xproperty(property); } return; }