1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // This is a benchmark example to validate 2D axisymmetry with 'hcurl' fields for electromagnetic waves.
- #include "sparselizardbase.h"
- using namespace mathop;
- void sparselizard(void)
- {
- // The domain regions:
- int sur = 1, right = 2, boundary = 3;
- int n = 50;
- shape q("quadrangle", sur, {0.005,0,0, 0.055,0,0, 0.055,0.04,0, 0.005,0.04,0}, {n,n,n,n});
- shape lb = q.getsons()[0];
- lb.setphysicalregion(boundary);
- shape lr = q.getsons()[1];
- lr.setphysicalregion(right);
- shape lt = q.getsons()[2];
- lt.setphysicalregion(boundary);
- shape ll = q.getsons()[3];
- ll.setphysicalregion(boundary);
- mesh mymesh({q,lb,lr,lt,ll});
- setaxisymmetry();
- // Edge shape functions 'hcurl' for the electric field E.
- // Fields x and y are the x and y coordinate fields.
- field E("hcurl"), x("x"), y("y");
- // Use interpolation order 2 on the whole domain:
- E.setorder(sur, 2);
- double freq = 10.0e9, c = 299792458, k = 2.0*getpi()*freq/c;
- E.setconstraint(right, array3x1(0,y,0));
- // Perfect conductor boundary conditions:
- E.setconstraint(boundary);
- formulation maxwell;
- // This is the weak formulation for electromagnetic waves:
- maxwell += integral(sur, -curl(dof(E))*curl(tf(E)) + k*k*dof(E)*tf(E));
- solve(maxwell);
- E.write(sur, "E.pos", 2);
- compx(E).write(sur, "Ex.pos", 2);
- compy(E).write(sur, "Ey.pos", 2);
- double maxE = norm(E).max(sur, 5)[0];
- std::cout << "Max electric field norm is " << maxE << " V/m" << std::endl;
- // Code validation line. Can be removed.
- std::cout << (maxE < 0.138395 && maxE > 0.138393);
- }
- int main(void)
- {
- SlepcInitialize(0,{},0,0);
- sparselizard();
- SlepcFinalize();
- return 0;
- }
|