17 int i0=cells(icell,0);
18 int i1=cells(icell,1);
19 int i2=cells(icell,2);
22 double V00= points(i1,0)- points(i0,0);
23 double V01= points(i2,0)- points(i0,0);
25 double V10= points(i1,1)- points(i0,1);
26 double V11= points(i2,1)- points(i0,1);
29 double det=V00*V11 - V01*V10;
41 int i0=cells(icell,0);
42 int i1=cells(icell,1);
43 int i2=cells(icell,2);
47 double V00= points(i1,0)- points(i0,0);
48 double V10= points(i1,1)- points(i0,1);
50 double V01= points(i2,0)- points(i0,0);
51 double V11= points(i2,1)- points(i0,1);
53 double V02= points(i2,0)- points(i1,0);
54 double V12= points(i2,1)- points(i1,1);
59 double det=V00*V11 - V01*V10;
62 double ivol = 1.0/vol;
65 double dd0=V02*V02+V12*V12;
66 double dd1=V01*V01+V11*V11;
67 double dd2=V00*V00+V10*V10;
71 epar(0)= (dd1+dd2-dd0)*0.125*ivol;
72 epar(1)= (dd2+dd0-dd1)*0.125*ivol;
73 epar(2)= (dd0+dd1-dd2)*0.125*ivol;
77 npar(0)= (epar(2)*dd2+epar(1)*dd1)*0.25;
78 npar(1)= (epar(0)*dd0+epar(2)*dd2)*0.25;
79 npar(2)= (epar(1)*dd1+epar(0)*dd0)*0.25;
96 for (
int ibface=0; ibface<nbfaces; ibface++)
99 int ireg=bfaceregions(ibface);
100 double dx= points(bfaces(ibface,1),0)-points(bfaces(ibface,0),0);
101 double dy= points(bfaces(ibface,1),1)-points(bfaces(ibface,0),1);
102 double h=sqrt(dx*dx+dy*dy);
103 double factor=0.5*h*bcfac(ireg);
104 if (bcfac(ireg)>=
Dirichlet) factor=bcfac(ireg);
108 SGlobal(i,i)+=factor;
109 Rhs(i)+=factor*bcval(ireg);
112 SGlobal(i,i)+=factor;
113 Rhs(i)+=factor*bcval(ireg);
134 for (
int ibface=0; ibface<nbfaces; ibface++)
137 int ireg=bfaceregions(ibface);
138 double dx= points(bfaces(ibface,1),0)-points(bfaces(ibface,0),0);
139 double dy= points(bfaces(ibface,1),1)-points(bfaces(ibface,0),1);
140 double h=sqrt(dx*dx+dy*dy);
141 double factor=0.5*h*bcfac(ireg);
142 if (bcfac(ireg)>=
Dirichlet) factor=bcfac(ireg);
146 SGlobal(i,i)+=factor;
147 Rhs(i)+=factor*(Sol(i)-bcval(ireg));
151 SGlobal(i,i)+=factor;
152 Rhs(i)+=factor*(Sol(i)-bcval(ireg));
180 const int nnodes_per_cell=3;
181 const int nedges_per_cell=3;
189 for (
int icell=0; icell<ncells; icell++)
193 for (
int inode=0;inode<nnodes_per_cell;inode++)
195 int k=cells(icell,inode);
196 Rhs(k)=source(k)*npar(inode);
199 for (
int iedge=0;iedge<nedges_per_cell;iedge++)
201 int k0=cells(icell,edgenodes(iedge,0));
202 int k1=cells(icell,edgenodes(iedge,1));
206 SGlobal(k0,k0)+=epar(iedge)*0.5*(kappa(k0)+kappa(k1));
207 SGlobal(k0,k1)-=epar(iedge)*0.5*(kappa(k0)+kappa(k1));
208 SGlobal(k1,k0)-=epar(iedge)*0.5*(kappa(k0)+kappa(k1));
209 SGlobal(k1,k1)+=epar(iedge)*0.5*(kappa(k0)+kappa(k1));
224 std::function <
void(
const double,
double&,
double&)> fkappa,
242 const int nnodes_per_cell=3;
243 const int nedges_per_cell=3;
257 for (
int icell=0; icell<ncells; icell++)
261 for (
int inode=0;inode<nnodes_per_cell;inode++)
263 int k=cells(icell,inode);
264 Rhs(k)-=source(k)*npar(inode);
265 fkappa(Sol(k),kappa(inode),dkappa(inode));
268 for (
int iedge=0;iedge<nedges_per_cell;iedge++)
270 int i0=edgenodes(iedge,0);
271 int i1=edgenodes(iedge,1);
272 int k0=cells(icell,i0);
273 int k1=cells(icell,i1);
276 double flux=epar(iedge)*0.5*(kappa(i0)+kappa(i1))*(Sol(k0)-Sol(k1));
280 SGlobal(k0,k0)+= epar(iedge)*( 0.5*(kappa(i0)+kappa(i1))+0.5*dkappa(i0)*(Sol(k0)-Sol(k1)));
281 SGlobal(k0,k1)+= epar(iedge)*(-0.5*(kappa(i0)+kappa(i1))+0.5*dkappa(i1)*(Sol(k0)-Sol(k1)));
282 SGlobal(k1,k0)+= epar(iedge)*(-0.5*(kappa(i0)+kappa(i1))-0.5*dkappa(i0)*(Sol(k0)-Sol(k1)));
283 SGlobal(k1,k1)+= epar(iedge)*( 0.5*(kappa(i0)+kappa(i1))-0.5*dkappa(i1)*(Sol(k0)-Sol(k1)));
302 for (
int ibface=0; ibface<nbfaces; ibface++)
305 int ireg=bfaceregions(ibface);
335 for (
int icell=0; icell<ncells; icell++)
340 for (
int i=0;i<=ndim;i++)
341 norm+=u(cells(icell,i))*u(cells(icell,i))*npar(i);
363 for (
int icell=0; icell<ncells; icell++)
368 double d01=u(cells(icell,0))-u(cells(icell,1));
369 double d02=u(cells(icell,0))-u(cells(icell,2));
370 double d12=u(cells(icell,1))-u(cells(icell,2));
373 norm+=epar(0)*d12*d12+epar(1)*d02*d02+epar(2)*d01*d01;
double l2norm(const numcxx::SimpleGrid &grid, const numcxx::DArray1 &u)
const int ncells() const
Return number of cells.
void initialize_bc(numcxx::SimpleGrid &grid, numcxx::DArray1 &g, numcxx::DArray1 &Sol)
Sparse matrix class using CRS storage scheme.
const int nbfaces() const
Return number of boundary faces.
const TArray2< int > & get_bfaces() const
Get array of point indices describing boundary faces.
Header for simple grid data class.
void compute_local_formfactors(const int icell, const numcxx::DArray2 &points, const numcxx::IArray2 &cells, numcxx::DArray1 &epar, numcxx::DArray1 &npar, double &vol)
void flush()
Re-create the internal data structure in order to accomodated all newly created elements.
const TArray2< double > & get_points() const
Get array of point coordinates.
Main header of the library.
const TArray1< int > & get_bfaceregions() const
Get array of boundary markers.
void compute_cell_volume(const int icell, const numcxx::DArray2 &points, const numcxx::IArray2 &cells, double &vol)
void assemble_and_apply_nonlinear_heat(const numcxx::SimpleGrid &grid, const numcxx::DArray1 &bcfac, const numcxx::DArray1 &bcval, const numcxx::DArray1 &source, std::function< void(const double, double &, double &)> fkappa, numcxx::DSparseMatrix &SGlobal, numcxx::DArray1 &Sol, numcxx::DArray1 &Rhs)
void assemble_heat_problem(const numcxx::SimpleGrid &Grid, const numcxx::DArray1 &BCfac, const numcxx::DArray1 &BCval, const numcxx::DArray1 &Source, const numcxx::DArray1 &Kappa, numcxx::DSparseMatrix &SGlobal, numcxx::DArray1 &Rhs)
void assemble_apply_bc(const numcxx::SimpleGrid &grid, const numcxx::DArray1 &bcfac, const numcxx::DArray1 &bcval, numcxx::DSparseMatrix &SGlobal, numcxx::DArray1 &Sol, numcxx::DArray1 &Rhs)
One dimensional array class.
Class containing data for simple grid data structure.
Two-dimensional array class.
double h1norm(const numcxx::SimpleGrid &grid, const numcxx::DArray1 &u)
void assemble_bc(const numcxx::SimpleGrid &grid, const numcxx::DArray1 &bcfac, const numcxx::DArray1 &bcval, numcxx::DSparseMatrix &SGlobal, numcxx::DArray1 &Rhs)
const int npoints() const
Return number of points.
A::value_type norm(const A &a)
Euklidean norm of array or expression.
const double Dirichlet
BC value marking Dirichlet boundary condition.
const TArray2< int > & get_cells() const
Get array of point indices describing cells.
const int spacedim() const
Return dimension of space.