HArD::Core3D
Hybrid Arbitrary Degree::Core 3D - Library to implement 3D schemes with vertex, edge, face and cell polynomials as unknowns
Loading...
Searching...
No Matches
ecddr-einstein-dtb.hpp
Go to the documentation of this file.
1// Implementation of the discrete exterior calculus de Rham sequence for Einstein's equations in differential form formulation.
2//
3// Author: Jia Jia Qian(jiajia.qian1@monash.edu)
4//
5/*
6 *
7 * If using this scheme in scientific publications, please cite the following article:
8 *
9 * A polytopal discrete de Rham scheme for the exterior calculus Einstein's equations
10 * Todd A. Oliynyk and Jia Jia Qian
11 * arxiv: https://arxiv.org/abs/2505.00286
12 */
13
14
15#ifndef ECDDR_EINSTEIN_DTB_HPP
16#define ECDDR_EINSTEIN_DTB_HPP
17
18#include <iostream>
19
20#include <boost/math/constants/constants.hpp>
21
22#include <Eigen/Sparse>
23#include <unsupported/Eigen/SparseExtra>
24
25#include <mesh.hpp>
26#include <mesh_builder.hpp>
28#include <linearsolver.hpp>
29#include <parallel_for.hpp>
30
31#include "ddr_spaces.hpp"
32#include "ddr_pec.hpp"
33#include "ddr_spaces.hpp"
34
35namespace HArDCore3D
36{
39 {
41 EinsteinNorms(Eigen::VectorXd norm_D, Eigen::VectorXd norm_theta, Eigen::VectorXd norm_B):
42 D(norm_D),
44 B(norm_B)
45 {
46 // do nothing
47 };
48
49 // Constructor without arguments
51
52 Eigen::VectorXd D;
53 Eigen::VectorXd theta;
54 Eigen::VectorXd B;
55 };
56
58 struct Einstein
59 {
60 typedef Eigen::SparseMatrix<double> SystemMatrixType;
61
62 typedef std::function<double(const Eigen::Vector3d &)> ZeroFormType;
63 typedef std::function<Eigen::Vector3d(const Eigen::Vector3d &)> OneFormType;
64 typedef std::function<Eigen::Vector3d(const Eigen::Vector3d &)> TwoFormType;
65 typedef std::function<double(const Eigen::Vector3d &)> ThreeFormType;
67
68 typedef std::vector<ZeroFormType> Collection0Forms;
69 typedef std::vector<OneFormType> Collection1Forms;
70 typedef std::vector<TwoFormType> Collection2Forms;
71 typedef std::vector<ThreeFormType> Collection3Forms;
72
73 typedef std::function<double(const double t, const Eigen::Vector3d &)> TZeroFormType;
74 typedef std::function<Eigen::Vector3d(const double t, const Eigen::Vector3d &)> TOneFormType;
75 typedef std::function<Eigen::Vector3d(const double t, const Eigen::Vector3d &)> TTwoFormType;
76 typedef std::function<double(const double t, const Eigen::Vector3d &)> TThreeFormType;
78
79 typedef std::vector<ZeroFormType> TCollection0Forms;
80 typedef std::vector<TOneFormType> TCollection1Forms;
81 typedef std::vector<TTwoFormType> TCollection2Forms;
82 typedef std::vector<TThreeFormType> TCollection3Forms;
83
84 typedef std::function<Eigen::Vector3d(const Eigen::MatrixXd & E, const Eigen::MatrixXd & B)> CompositeHType;
85 typedef std::vector<CompositeHType> CollectionHforms;
86 typedef std::function<Eigen::Vector3d(const Eigen::MatrixXd & D)> CompositeEType;
87 typedef std::vector<CompositeEType> CollectionEforms;
88 typedef std::function<Eigen::Vector3d(const Eigen::VectorXd & E0, const Eigen::VectorXd & D0, const Eigen::MatrixXd & H, const Eigen::MatrixXd & E, const Eigen::MatrixXd & D, const Eigen::MatrixXd & B)> CompositeUType;
89 typedef std::vector<CompositeUType> CollectionUforms;
90
93 const DDR_Spaces & ddrspaces,
94 bool use_threads,
95 double stab_par,
96 std::ostream & output = std::cout
97 );
98
99 //--------------------------------------------------
100 // Methods to assemble and solve
101 //--------------------------------------------------
102
103 Eigen::VectorXd updateLapse(double dt, Eigen::VectorXd & lapse_n, Eigen::VectorXd & starDtB);
105 void precomputeL2();
106
108 double dt,
109 const ZeroFormType & lapse,
110 const OneFormType & E0,
111 const Eigen::VectorXd & starDtB
112 );
113
115 double dt,
116 const ZeroFormType & lapse_n,
117 const std::vector<TwoFormType> & D,
118 const std::vector<OneFormType> & theta,
119 const std::vector<TwoFormType> & B,
120 const std::vector<TwoFormType> & dtD,
121 const std::vector<OneFormType> & E,
122 const std::vector<OneFormType> & H,
123 const std::vector<TwoFormType> & dH
124 );
125
126
127 void updateThetaRHS(
128 const Eigen::VectorXd & starD
129 );
130
132 double computeResidual(
133 const Eigen::VectorXd & starDB
134 ) const;
135
137 Eigen::VectorXd computeConstraints(
138 const ZeroFormType & lapse_n,
139 const std::vector<OneFormType> & theta0,
140 const std::vector<OneFormType> & thetan,
141 const Eigen::VectorXd & starDB0,
142 const Eigen::VectorXd & starDBn,
144 ) const;
145
147 std::vector<EinsteinNorms> computeEinsteinNorms(
148 const std::vector<Eigen::VectorXd> & list_dofs
149 ) const;
150
151 std::pair<EinsteinNorms, EinsteinNorms> computeContinuousErrorsNorms(
152 const Eigen::VectorXd & starDt,
153 const std::vector<OneFormType> & starD,
154 const std::vector<TwoFormType> & starTheta,
155 const std::vector<TwoFormType> & starB
156 ) const;
157
159 Eigen::MatrixXd basisChange(
160 size_t k,
161 const Eigen::MatrixXd & forms,
162 const Eigen::MatrixXd & basis
163 ) const;
164
166 Eigen::VectorXd contractIndex(
167 size_t index,
168 const Eigen::MatrixXd & forms
169 ) const;
170
172 Eigen::MatrixXd contractIndex(
173 size_t index,
174 const Eigen::MatrixXd & twoForm1,
175 const Eigen::MatrixXd & twoForm2
176 ) const;
177
179 Eigen::Vector3d wedge11(
180 const Eigen::Vector3d & form1,
181 const Eigen::Vector3d & form2
182 ) const;
183
185 Eigen::Matrix3d expand2Form(
186 const Eigen::Vector3d & form
187 ) const;
188
189 //--------------------------------------------------------
190 // Nonlinear calculations
191 //--------------------------------------------------------
192
194 composite_orth_H0 = [](const Eigen::VectorXd & orth_E0, const Eigen::Matrix3d & orth_B) -> Eigen::Vector3d {
195 return Eigen::Vector3d(
196 0,
197 0,
198 0
199 );
200 };
201
203 composite_orth_H1 = [](const Eigen::VectorXd & orth_E0, const Eigen::Matrix3d & orth_B) -> Eigen::Vector3d {
204 return Eigen::Vector3d(
205 -0.5*(-orth_B(1,1)+orth_B(0,2))+0.5*orth_B(2,0),
206 orth_E0(2)+orth_B(2,1),
207 -orth_E0(1)+orth_B(2,2)
208 );
209 };
210
212 composite_orth_H2 = [](const Eigen::VectorXd & orth_E0, const Eigen::Matrix3d & orth_B) -> Eigen::Vector3d {
213 return Eigen::Vector3d(
214 -orth_E0(2)-orth_B(1,0),
215 -0.5*(orth_B(0,2)+orth_B(2,0))-0.5*orth_B(1,1),
216 orth_E0(0)-orth_B(1,2)
217 );
218 };
219
221 composite_orth_H3 = [](const Eigen::VectorXd & orth_E0, const Eigen::Matrix3d & orth_B) -> Eigen::Vector3d {
222 return Eigen::Vector3d(
223 orth_E0(1)+orth_B(0,0),
224 -orth_E0(0)+orth_B(0,1),
225 -0.5*(orth_B(2,0)-orth_B(1,1))+0.5*orth_B(0,2)
226 );
227 };
228
230
232 composite_orth_E0 = [](const Eigen::Matrix3d & orth_D) -> Eigen::Vector3d {
233 return Eigen::Vector3d(
234 0,
235 0,
236 0
237 );
238 };
239
241 composite_orth_E1 = [](const Eigen::Matrix3d & orth_D) -> Eigen::Vector3d {
242 Eigen::Matrix3d starD = Eigen::Matrix<double,3,3>{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}} * orth_D;
243 return Eigen::Vector3d(
244 -0.5*starD(0,0)+0.5*(starD(1,1)+starD(2,2)),
245 -starD(0,1),
246 -starD(0,2)
247 );
248 };
249
251 composite_orth_E2 = [](const Eigen::Matrix3d & orth_D) -> Eigen::Vector3d {
252 Eigen::Matrix3d starD = Eigen::Matrix<double,3,3>{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}} * orth_D;
253 return Eigen::Vector3d(
254 -starD(1,0),
255 -0.5*starD(1,1)+0.5*starD(0,0)+0.5*starD(2,2),
256 -starD(1,2)
257 );
258 };
259
261 composite_orth_E3 = [](const Eigen::Matrix3d & orth_D) -> Eigen::Vector3d {
262 Eigen::Matrix3d starD = Eigen::Matrix<double,3,3>{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}} * orth_D;
263 return Eigen::Vector3d(
264 -starD(2,0),
265 -starD(2,1),
266 -0.5*starD(2,2)+0.5*starD(0,0)+0.5*starD(1,1)
267 );
268 };
269
271
273 composite_orth_U0 = [](const Eigen::Vector3d & E0, const Eigen::Vector3d & D0, const Eigen::Matrix3d & H, const Eigen::Matrix3d & E, const Eigen::Matrix3d & D, const Eigen::Matrix3d & B) -> Eigen::Vector3d {
274 return Eigen::Vector3d(
275 0,
276 0,
277 0
278 );
279 };
280
282 composite_orth_U1 = [](const Eigen::Vector3d & E0, const Eigen::Vector3d & D0, const Eigen::Matrix3d & H, const Eigen::Matrix3d & E, const Eigen::Matrix3d & D, const Eigen::Matrix3d & B) -> Eigen::Vector3d {
283 Eigen::Matrix<double,3,3> hstar{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}};
284 Eigen::Vector3d starD0 = hstar * D0;
285 Eigen::Matrix3d starD = hstar * D;
286 Eigen::Matrix3d starB = hstar * B;
287 Eigen::MatrixXd starU = Eigen::MatrixXd::Identity(3,3)
288 * 0.5 * (E0.transpose()*starD0 + (E.transpose()*starD).trace()
289 - (H.transpose()*starB).trace())
290 - starD0*E0.transpose() - starD * E.transpose() + starB * H.transpose();
291 return (hstar*starU).col(0);
292 };
293
295 composite_orth_U2 = [](const Eigen::Vector3d & E0, const Eigen::Vector3d & D0, const Eigen::Matrix3d & H, const Eigen::Matrix3d & E, const Eigen::Matrix3d & D, const Eigen::Matrix3d & B) -> Eigen::Vector3d {
296 Eigen::Matrix<double,3,3> hstar{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}};
297 Eigen::Vector3d starD0 = hstar * D0;
298 Eigen::Matrix3d starD = hstar * D;
299 Eigen::Matrix3d starB = hstar * B;
300 Eigen::MatrixXd starU = Eigen::MatrixXd::Identity(3,3)
301 * 0.5 * (E0.transpose()*starD0 + (E.transpose()*starD).trace()
302 - (H.transpose()*starB).trace())
303 - starD0*E0.transpose() - starD * E.transpose() + starB * H.transpose();
304 return (hstar*starU).col(1);
305 };
306
308 composite_orth_U3 = [](const Eigen::Vector3d & E0, const Eigen::Vector3d & D0, const Eigen::Matrix3d & H, const Eigen::Matrix3d & E, const Eigen::Matrix3d & D, const Eigen::Matrix3d & B) -> Eigen::Vector3d {
309 Eigen::Matrix<double,3,3> hstar{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}};
310 Eigen::Vector3d starD0 = hstar * D0;
311 Eigen::Matrix3d starD = hstar * D;
312 Eigen::Matrix3d starB = hstar * B;
313 Eigen::MatrixXd starU = Eigen::MatrixXd::Identity(3,3)
314 * 0.5 * (E0.transpose()*starD0 + (E.transpose()*starD).trace()
315 - (H.transpose()*starB).trace())
316 - starD0*E0.transpose() - starD * E.transpose() + starB * H.transpose();
317 return (hstar*starU).col(2);
318 };
319
321
322 //------------------------------------------------------------------
323 // Getters: dimension of space and numbers of unknowns of various types
324 //------------------------------------------------------------------
325
327 inline size_t dimensionSpace() const
328 {
329 return 3*(m_ddrspaces.dofspace(1).dimension() + m_ddrspaces.dofspace(2).dimension() + m_ddrspaces.dofspace(1).dimension());
330 }
331
332 //--------------------------------------------------------
333 // Getters: underlying ECDDR sequence
334 //--------------------------------------------------------
335
337 inline const DDR_Spaces & ddrSpaces() const
338 {
339 return m_ddrspaces;
340 }
341
342 //-------------------------------------------------
343 // Matrices and RHS
344 //-------------------------------------------------
345
347 inline const SystemMatrixType & systemMatrix() const {
348 return m_A;
349 }
350
353 return m_A;
354 }
355
357 inline const Eigen::VectorXd & systemVector() const {
358 return m_b;
359 }
360
362 inline Eigen::VectorXd & systemVector() {
363 return m_b;
364 }
365
367 inline const SystemMatrixType & L2_X1() const {
368 return m_L2_X1;
369 }
370
373 return m_L2_X1;
374 }
375
377 inline const SystemMatrixType & L2_X2() const {
378 return m_L2_X2;
379 }
380
383 return m_L2_X2;
384 }
385
387 inline const SystemMatrixType & lhsTheta() const {
388 return m_A_theta;
389 }
390
393 return m_A_theta;
394 }
395
397 inline const Eigen::VectorXd & rhsTheta() const {
398 return m_b_theta;
399 }
400
402 inline Eigen::VectorXd & rhsTheta() {
403 return m_b_theta;
404 }
405
406 //-------------------------------------------
407 // Getters: various parameters
408 //-------------------------------------------
409
411 inline const double & stabilizationParameter() const {
412 return m_stab_par;
413 }
414
416 inline double & stabilizationParameter() {
417 return m_stab_par;
418 }
419
420 inline double & min_detTheta() {
421 return m_min_detTheta;
422 }
423
424 //-------------------------------------------
425 // Manipulate functions
426 //-------------------------------------------
427
429 template<typename outValue, typename TFct>
430 std::function<outValue(const Eigen::Vector3d &)> contractPara(const TFct &F, double t) const
431 {
432 std::function<outValue(const Eigen::Vector3d &)> f = [&F, t](const Eigen::Vector3d &x) -> outValue {return F(t, x);};
433 return f;
434 }
436 template<typename outValue, typename Fct, typename TFct>
437 std::vector<Fct> contractParaVec(const std::vector<TFct> &TF, double t) const
438 {
439 std::vector<Fct> f;
440 for (size_t i = 0; i < TF.size(); i++){
441 f.emplace_back(contractPara<outValue>(TF[i], t));
442 }
443 return f;
444 }
445
446 private:
447
449 void _assemble_local_contribution(
450 size_t iT,
452 std::vector<std::list<Eigen::Triplet<double>>> & triplets_sys,
453 std::vector<Eigen::VectorXd> & vec
454 );
455
457 _compute_local_contribution(
458 const double dt,
459 const size_t iT,
460 const ZeroFormType & lapse,
461 const OneFormType & E0,
462 const Eigen::VectorXd & starDtB
463 );
464
465 std::tuple<Eigen::VectorXd, Eigen::VectorXd, Eigen::MatrixXd, Eigen::MatrixXd, double>
466 _compute_nonlinear_relations(
467 const size_t iT,
468 const ZeroFormType & lapse,
469 const OneFormType & E0,
470 const Eigen::VectorXd & starDtB
471 );
472
473 // Constructor parameter
474 const DDR_Spaces & m_ddrspaces;
475 bool m_use_threads;
476 std::ostream & m_output;
477
478 // Product matrix and RHS
480 Eigen::VectorXd m_b;
481 SystemMatrixType m_L2_X1;
482 SystemMatrixType m_L2_X2;
483 SystemMatrixType m_A_theta;
484 Eigen::VectorXd m_b_theta;
485 double m_stab_par;
486 double m_min_detTheta;
487 };
488
489 static const double PI = boost::math::constants::pi<double>();
490 using std::sin;
491 using std::cos;
492 using std::pow;
493 using std::cyl_bessel_j;
494
495 //------------------------------------------------------------------------------
496 // Hodge star of functions
497 //------------------------------------------------------------------------------
498
499 // Hodge star of a continuous function with space and time variables
500 std::function<Eigen::Vector3d(double t, const Eigen::Vector3d &)> star(const std::function<Eigen::Vector3d(double t, const Eigen::Vector3d &)> &F)
501 {
502 std::function<Eigen::Vector3d(double t, const Eigen::Vector3d &)> f = [&F](double t, const Eigen::Vector3d &x) -> Eigen::Vector3d {return Eigen::Matrix<double,3,3>{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}}*F(t, x);};
503 return f;
504 }
505 // Hodge star of a continuous function with space variable
506 std::function<Eigen::Vector3d(const Eigen::Vector3d &)> star(const std::function<Eigen::Vector3d(const Eigen::Vector3d &)> &F)
507 {
508 std::function<Eigen::Vector3d(const Eigen::Vector3d &)> f = [&F](const Eigen::Vector3d &x) -> Eigen::Vector3d {return Eigen::Matrix<double,3,3>{{0.,0.,1.},{0.,-1.,0.},{1.,0.,0.}}*F(x);};
509 return f;
510 }
511 // Hodge star of a collection of functions in a vector
512 template<typename Fct>
513 std::vector<Fct> starCol(const std::vector<Fct> &F)
514 {
515 std::vector<Fct> f;
516 for (size_t i = 0; i < F.size(); i++){
517 f.emplace_back(star(F[i]));
518 }
519 return f;
520 }
521 // Random noise function
522 std::function<Eigen::Vector3d(const Eigen::Vector3d &)> noise(const std::function<Eigen::Vector3d(const Eigen::Vector3d &)> &f)
523 {
524 std::function<Eigen::Vector3d(const Eigen::Vector3d &)> fnoise = [f](const Eigen::Vector3d &x) -> Eigen::Vector3d {return f(x)+Eigen::Vector3d::Random()*1e-10;};
525
526 return fnoise;
527 }
528
529
530 //------------------------------------------------------------------------------
531 // Minkowski solution (D, theta, B)
532 //------------------------------------------------------------------------------
533
535 minkowski_lapse = [](const double t, const Eigen::Vector3d & x) -> double {
536 return 1.0;
537 };
538
540 minkowski_theta0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
541 return Eigen::Vector3d(
542 0,
543 0,
544 0
545 );
546 };
547
549 minkowski_theta1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
550 return Eigen::Vector3d(
551 1.,
552 0,
553 0
554 );
555 };
556
558 minkowski_theta2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
559 return Eigen::Vector3d(
560 0,
561 1.,
562 0
563 );
564 };
565
567 minkowski_theta3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
568 return Eigen::Vector3d(
569 0,
570 0,
571 1.
572 );
573 };
574
576
578 minkowski_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
579 return Eigen::Vector3d(
580 0,
581 0,
582 0
583 );
584 };
585
587 minkowski_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
588 return Eigen::Vector3d(
589 0,
590 0,
591 0
592 );
593 };
594
596 minkowski_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
597 return Eigen::Vector3d(
598 0,
599 0,
600 0
601 );
602 };
603
605 minkowski_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
606 return Eigen::Vector3d(
607 0,
608 0,
609 0
610 );
611 };
612
614
616 minkowski_dE0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
617 return Eigen::Vector3d(
618 0,
619 0,
620 0
621 );
622 };
623
625 minkowski_dE1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
626 return Eigen::Vector3d(
627 0,
628 0,
629 0
630 );
631 };
632
634 minkowski_dE2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
635 return Eigen::Vector3d(
636 0,
637 0,
638 0
639 );
640 };
641
643 minkowski_dE3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
644 return Eigen::Vector3d(
645 0,
646 0,
647 0
648 );
649 };
650
652
654 minkowski_B0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
655 return Eigen::Vector3d(
656 0,
657 0,
658 0
659 );
660 };
661
663 minkowski_B1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
664 return Eigen::Vector3d(
665 0,
666 0,
667 0
668 );
669 };
670
672 minkowski_B2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
673 return Eigen::Vector3d(
674 0,
675 0,
676 0
677 );
678 };
679
681 minkowski_B3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
682 return Eigen::Vector3d(
683 0,
684 0,
685 0
686 );
687 };
688
690
692 minkowski_dtB0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
693 return Eigen::Vector3d(
694 0,
695 0,
696 0
697 );
698 };
699
701 minkowski_dtB1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
702 return Eigen::Vector3d(
703 0,
704 0,
705 0
706 );
707 };
708
710 minkowski_dtB2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
711 return Eigen::Vector3d(
712 0,
713 0,
714 0
715 );
716 };
717
719 minkowski_dtB3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
720 return Eigen::Vector3d(
721 0,
722 0,
723 0
724 );
725 };
726
728
730 minkowski_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
731 return Eigen::Vector3d(
732 0,
733 0,
734 0
735 );
736 };
737
739 minkowski_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
740 return Eigen::Vector3d(
741 0,
742 0,
743 0
744 );
745 };
746
748 minkowski_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
749 return Eigen::Vector3d(
750 0,
751 0,
752 0
753 );
754 };
755
757 minkowski_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
758 return Eigen::Vector3d(
759 0,
760 0,
761 0
762 );
763 };
764
766
768 minkowski_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
769 return Eigen::Vector3d(
770 0,
771 0,
772 0
773 );
774 };
775
777 minkowski_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
778 return Eigen::Vector3d(
779 0,
780 0,
781 0
782 );
783 };
784
786 minkowski_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
787 return Eigen::Vector3d(
788 0,
789 0,
790 0
791 );
792 };
793
795 minkowski_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
796 return Eigen::Vector3d(
797 0,
798 0,
799 0
800 );
801 };
802
804
806 minkowski_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
807 return Eigen::Vector3d(
808 0,
809 0,
810 0
811 );
812 };
813
815 minkowski_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
816 return Eigen::Vector3d(
817 0,
818 0,
819 0
820 );
821 };
822
824 minkowski_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
825 return Eigen::Vector3d(
826 0,
827 0,
828 0
829 );
830 };
831
833 minkowski_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
834 return Eigen::Vector3d(
835 0,
836 0,
837 0
838 );
839 };
840
842
844 minkowski_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
845 return Eigen::Vector3d(
846 0,
847 0,
848 0
849 );
850 };
851
853 minkowski_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
854 return Eigen::Vector3d(
855 0,
856 0,
857 0
858 );
859 };
860
862 minkowski_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
863 return Eigen::Vector3d(
864 0,
865 0,
866 0
867 );
868 };
869
871 minkowski_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
872 return Eigen::Vector3d(
873 0,
874 0,
875 0
876 );
877 };
878
880
881 //------------------------------------------------------------------------------
882 // Kasner solution (D, theta, B) (1/2, 1/4(1-sqrt(5)), 1/4(1+sqrt(5)))
883 //------------------------------------------------------------------------------
884
886 kasner_lapse = [](const double t, const Eigen::Vector3d & x) -> double {
887 return pow(t, 1.0);
888 };
889
891 kasner_theta0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
892 return Eigen::Vector3d(0, 0, 0);
893 };
894
896 kasner_theta1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
897 return Eigen::Vector3d(sqrt(t), 0, 0);
898 };
899
901 kasner_theta2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
902 return Eigen::Vector3d(0, pow(t, -0.30901699437494745), 0);
903 };
904
906 kasner_theta3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
907 return Eigen::Vector3d(0, 0, pow(t, 0.80901699437494745));
908 };
909
911
912 // This is E0 = 1/N dN
914 kasner_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
915 return Eigen::Vector3d(0, 0, 0);
916 };
917
919 kasner_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
920 return Eigen::Vector3d(0.5*pow(t, -0.5), 0, 0);
921 };
922
924 kasner_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
925 return Eigen::Vector3d(0, -0.30901699437494745*pow(t, -1.3090169943749475), 0);
926 };
927
929 kasner_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
930 return Eigen::Vector3d(0, 0, 0.80901699437494745*pow(t, -0.19098300562505255));
931 };
932
934
935//------------------------------------------------------------------------------
936// Det h E
938 deth_kasner_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
939 return Eigen::Vector3d(0, 0, 0);
940 };
941
943 deth_kasner_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
944 return Eigen::Vector3d(0.5*pow(t, -1.5), 0, 0);
945 };
946
948 deth_kasner_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
949 return Eigen::Vector3d(0, -0.30901699437494745*pow(t, -2.3090169943749475), 0);
950 };
951
953 deth_kasner_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
954 return Eigen::Vector3d(0, 0, 0.80901699437494745*pow(t, -1.1909830056250525));
955 };
956
958
959//------------------------------------------------------------------------------
960
962 kasner_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
963 return Eigen::Vector3d(0, 0, 0);
964 };
965
967 kasner_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
968 return Eigen::Vector3d(0, 0, 0.5*pow(t, -0.5));
969 };
970
972 kasner_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
973 return Eigen::Vector3d(0, -1.3090169943749475*pow(t, 0.30901699437494745), 0);
974 };
975
977 kasner_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
978 return Eigen::Vector3d(0.19098300562505255*pow(t, -0.80901699437494745), 0, 0);
979 };
980
982
983//------------------------------------------------------------------------------
984// Det h D
985
987 deth_kasner_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
988 return Eigen::Vector3d(0, 0, 0);
989 };
990
992 deth_kasner_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
993 return Eigen::Vector3d(0, 0, 0.5*pow(t, -1.5));
994 };
995
997 deth_kasner_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
998 return Eigen::Vector3d(0, -1.3090169943749475*pow(t, -0.69098300562505255), 0);
999 };
1000
1002 deth_kasner_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1003 return Eigen::Vector3d(0.19098300562505255*pow(t, -1.8090169943749475), 0, 0);
1004 };
1005
1007
1008//------------------------------------------------------------------------------
1009
1011 kasner_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1012 return Eigen::Vector3d(0, 0, 0);
1013 };
1014
1016 kasner_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1017 return Eigen::Vector3d(0, 0, -0.25*pow(t, -1.5));
1018 };
1019
1021 kasner_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1022 return Eigen::Vector3d(0, -0.40450849718747378*pow(t, -0.69098300562505255), 0);
1023 };
1024
1026 kasner_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1027 return Eigen::Vector3d(-0.1545084971874737*pow(t, -1.8090169943749475), 0, 0);
1028 };
1029
1031
1032//------------------------------------------------------------------------------
1033// Det h dtD
1034
1036 deth_kasner_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1037 return Eigen::Vector3d(0, 0, 0);
1038 };
1039
1041 deth_kasner_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1042 return Eigen::Vector3d(0, 0, -0.75*pow(t, -2.5));
1043 };
1044
1046 deth_kasner_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1047 return Eigen::Vector3d(0, 0.90450849718747373*pow(t, -1.6909830056250525), 0);
1048 };
1049
1051 deth_kasner_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1052 return Eigen::Vector3d(-0.34549150281252622*pow(t, -2.8090169943749475), 0, 0);
1053 };
1054
1056
1057//------------------------------------------------------------------------------
1058
1060 kasner_B0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1061 return Eigen::Vector3d(0, 0, 0);
1062 };
1063
1065 kasner_B1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1066 return Eigen::Vector3d(0, 0, 0);
1067 };
1068
1070 kasner_B2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1071 return Eigen::Vector3d(0, 0, 0);
1072 };
1073
1075 kasner_B3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1076 return Eigen::Vector3d(0, 0, 0);
1077 };
1078
1080
1081//------------------------------------------------------------------------------
1082
1084 kasner_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1085 return Eigen::Vector3d(0, 0, 0);
1086 };
1087
1089 kasner_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1090 return Eigen::Vector3d(0, 0, 0);
1091 };
1092
1094 kasner_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1095 return Eigen::Vector3d(0, 0, 0);
1096 };
1097
1099 kasner_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1100 return Eigen::Vector3d(0, 0, 0);
1101 };
1102
1104
1105//------------------------------------------------------------------------------
1106// Det h H
1107
1109 deth_kasner_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1110 return Eigen::Vector3d(0, 0, 0);
1111 };
1112
1114 deth_kasner_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1115 return Eigen::Vector3d(0, 0, 0);
1116 };
1117
1119 deth_kasner_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1120 return Eigen::Vector3d(0, 0, 0);
1121 };
1122
1124 deth_kasner_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1125 return Eigen::Vector3d(0, 0, 0);
1126 };
1127
1129
1130//------------------------------------------------------------------------------
1131
1133 kasner_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1134 return Eigen::Vector3d(0, 0, 0);
1135 };
1136
1138 kasner_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1139 return Eigen::Vector3d(0, 0, 0);
1140 };
1141
1143 kasner_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1144 return Eigen::Vector3d(0, 0, 0);
1145 };
1146
1148 kasner_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1149 return Eigen::Vector3d(0, 0, 0);
1150 };
1151
1153
1154//------------------------------------------------------------------------------
1155// Det h dH
1156
1158 deth_kasner_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1159 return Eigen::Vector3d(0, 0, 0);
1160 };
1161
1163 deth_kasner_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1164 return Eigen::Vector3d(0, 0, 0);
1165 };
1166
1168 deth_kasner_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1169 return Eigen::Vector3d(0, 0, 0);
1170 };
1171
1173 deth_kasner_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1174 return Eigen::Vector3d(0, 0, 0);
1175 };
1176
1178
1179 //------------------------------------------------------------------------------
1180 // Gowdy solution (D, theta, B)
1181 //------------------------------------------------------------------------------
1182
1184 gowdy_lapse = [](const double t, const Eigen::Vector3d & x) -> double {
1185 return pow(t, -0.25)*exp(0.5*pow(M_PI, 2)*pow(t, 2)*(pow(cyl_bessel_j(0, 2*M_PI*t), 2) + pow(cyl_bessel_j(1, 2*M_PI*t), 2)) - 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*pow(M_PI, 2)*(pow(cyl_bessel_j(1, 2*M_PI), 2) + pow(cyl_bessel_j(0, 2*M_PI), 2)) + 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI));
1186 };
1187
1189 gowdy_theta0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1190 return Eigen::Vector3d(
1191 0,
1192 0,
1193 0
1194 );
1195 };
1196
1198 gowdy_theta1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1199 return Eigen::Vector3d(
1200 sqrt(t)*exp(0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)),
1201 0,
1202 0
1203 );
1204 };
1205
1207 gowdy_theta2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1208 return Eigen::Vector3d(
1209 0,
1210 sqrt(t)*exp(-0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)),
1211 0
1212 );
1213 };
1214
1216 gowdy_theta3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1217 return Eigen::Vector3d(
1218 0,
1219 0,
1220 pow(t, -0.25)*exp(M_PI*( 0.5*M_PI*pow(t, 2)*(pow(cyl_bessel_j(0, 2*M_PI*t), 2) + pow(cyl_bessel_j(1, 2*M_PI*t), 2))
1221 -0.5*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t)
1222 -0.5*M_PI*(pow(cyl_bessel_j(1, 2*M_PI), 2) + pow(cyl_bessel_j(0, 2*M_PI), 2))
1223 + 0.25*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI)))
1224 );
1225 };
1226
1228
1230 gowdy_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1231 return Eigen::Vector3d(
1232 0,
1233 0,
1234 -1.0*pow(M_PI, 2)*pow(t, 1.0)*sin(4*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t)
1235 );
1236 };
1237
1239 gowdy_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1240 return Eigen::Vector3d(
1241 pow(t, -0.25)*(-1.0*M_PI*pow(t, 1.0)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t) + 0.5)*exp(M_PI*(-0.5*M_PI*pow(t, 2)*(pow(cyl_bessel_j(0, 2*M_PI*t), 2) + pow(cyl_bessel_j(1, 2*M_PI*t), 2)) + 0.5*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.25*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*M_PI*(pow(cyl_bessel_j(1, 2*M_PI), 2) + pow(cyl_bessel_j(0, 2*M_PI), 2))) + 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)),
1242 0,
1243 0
1244 );
1245 };
1246
1248 gowdy_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1249 return Eigen::Vector3d(
1250 0,
1251 pow(t, -0.25)*(1.0*M_PI*pow(t, 1.0)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t) + 0.5)*exp(-0.5*pow(M_PI, 2)*pow(t, 2)*(pow(cyl_bessel_j(0, 2*M_PI*t), 2) + pow(cyl_bessel_j(1, 2*M_PI*t), 2)) + 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*pow(M_PI, 2)*(pow(cyl_bessel_j(1, 2*M_PI), 2) + pow(cyl_bessel_j(0, 2*M_PI), 2))),
1252 0
1253 );
1254 };
1255
1257 gowdy_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1258 return Eigen::Vector3d(
1259 0,
1260 0,
1261 1.0/t*(-1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.25)
1262 );
1263 };
1264
1266
1268 gowdy_dE0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1269 return Eigen::Vector3d(
1270 0,
1271 0,
1272 0
1273 );
1274 };
1275
1277 gowdy_dE1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1278 return Eigen::Vector3d(
1279 0,
1280 0,
1281 1.0/t*(-1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.25)
1282 );
1283 };
1284
1286 gowdy_dE2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1287 return Eigen::Vector3d(
1288 0,
1289 0,
1290 1.0*M_PI*pow(t, -0.25)*(2.0*M_PI*pow(t, 1.0)*cyl_bessel_j(1, 2*M_PI*t) + 2.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) - 0.5*cyl_bessel_j(0, 2*M_PI*t))*exp(-0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(1, 2*M_PI), 2) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(0, 2*M_PI), 2))*sin(2*M_PI*x(2))
1291 );
1292 };
1293
1295 gowdy_dE3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1296 return Eigen::Vector3d(
1297 0,
1298 0,
1299 0
1300 );
1301 };
1302
1304
1306 gowdy_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1307 return Eigen::Vector3d(
1308 0,
1309 0,
1310 0
1311 );
1312 };
1313
1315 gowdy_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1316 return Eigen::Vector3d(
1317 0,
1318 M_PI*sqrt(t)*(-1.0*pow(t, 0.25) - 2.0*M_PI*pow(t, 1.25)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t))*exp(-0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(1, 2*M_PI), 2) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(0, 2*M_PI), 2))*sin(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t),
1319 0
1320 );
1321 };
1322
1324 gowdy_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1325 return Eigen::Vector3d(
1326 M_PI*sqrt(t)*(-1.0*pow(t, 0.25) + 2.0*M_PI*pow(t, 1.25)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t))*exp(-0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) + 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(1, 2*M_PI), 2) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(0, 2*M_PI), 2))*sin(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t),
1327 0,
1328 0
1329 );
1330 };
1331
1333 gowdy_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1334 return Eigen::Vector3d(
1335 0,
1336 0,
1337 0
1338 );
1339 };
1340
1342
1344 gowdy_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1345 return Eigen::Vector3d(
1346 0,
1347 0,
1348 0
1349 );
1350 };
1351
1353 gowdy_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1354 return Eigen::Vector3d(
1355 0,
1356 0,
1357 1.0*pow(M_PI, 2)*(1.0*pow(t, 0.75)*pow(sin(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t) + 2.0*pow(t, 0.75)*cos(2*M_PI*x(2)) - 4.0*M_PI*pow(t, 1.75)*pow(sin(2*M_PI*x(2)), 2)*cyl_bessel_j(1, 2*M_PI*t) + 4.0*M_PI*pow(t, 1.75)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(1, 2*M_PI*t) - 4.0*pow(M_PI, 2)*pow(t, 2.75)*pow(sin(2*M_PI*x(2)), 2)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*pow(cyl_bessel_j(1, 2*M_PI*t), 2))*exp(-0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(1, 2*M_PI), 2) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(0, 2*M_PI), 2))*cyl_bessel_j(0, 2*M_PI*t)
1358 );
1359 };
1360
1362 gowdy_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1363 return Eigen::Vector3d(
1364 0,
1365 1.0*pow(M_PI, 2)*(-1.0*pow(t, 0.75)*pow(sin(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t) + 2.0*pow(t, 0.75)*cos(2*M_PI*x(2)) + 4.0*M_PI*pow(t, 1.75)*pow(sin(2*M_PI*x(2)), 2)*cyl_bessel_j(1, 2*M_PI*t) - 4.0*M_PI*pow(t, 1.75)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(1, 2*M_PI*t) + 4.0*pow(M_PI, 2)*pow(t, 2.75)*pow(sin(2*M_PI*x(2)), 2)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*pow(cyl_bessel_j(1, 2*M_PI*t), 2))*exp(-0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*pow(M_PI, 2)*pow(t, 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) + 0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(1, 2*M_PI), 2) + 0.5*pow(M_PI, 2)*pow(cyl_bessel_j(0, 2*M_PI), 2))*cyl_bessel_j(0, 2*M_PI*t),
1366 0
1367 );
1368 };
1369
1371 gowdy_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1372 return Eigen::Vector3d(
1373 0,
1374 0,
1375 0
1376 );
1377 };
1378
1380
1382 gowdy_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1383 return Eigen::Vector3d(
1384 0,
1385 0,
1386 0
1387 );
1388 };
1389
1391 gowdy_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1392 return Eigen::Vector3d(
1393 0,
1394 0,
1395 pow(t, -0.5)*(1.0*M_PI*pow(t, 1.0)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t) - 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) + 0.25)*exp(-0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t))
1396 );
1397 };
1398
1400 gowdy_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1401 return Eigen::Vector3d(
1402 0,
1403 pow(t, -0.5)*(1.0*M_PI*pow(t, 1.0)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t) + 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) - 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.25)*exp(0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)),
1404 0
1405 );
1406 };
1407
1409 gowdy_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1410 return Eigen::Vector3d(
1411 1.0*pow(t, 0.25)*exp(M_PI*(-0.5*M_PI*pow(t, 2)*(pow(cyl_bessel_j(0, 2*M_PI*t), 2) + pow(cyl_bessel_j(1, 2*M_PI*t), 2)) + 0.5*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.25*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*M_PI*(pow(cyl_bessel_j(1, 2*M_PI), 2) + pow(cyl_bessel_j(0, 2*M_PI), 2)))),
1412 0,
1413 0
1414 );
1415 };
1416
1418
1420 gowdy_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1421 return Eigen::Vector3d(
1422 0,
1423 0,
1424 0
1425 );
1426 };
1427
1429 gowdy_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1430 return Eigen::Vector3d(
1431 0,
1432 0,
1433 pow(t, -2.0)*(-0.125*sqrt(t) - 0.25*M_PI*pow(t, 1.5)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t) - 1.5*pow(M_PI, 2)*pow(t, 2.5)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) + 0.5*pow(M_PI, 2)*pow(t, 2.5)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 2.0*pow(M_PI, 2)*pow(t, 2.5)*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) + 1.5*pow(M_PI, 2)*pow(t, 2.5)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 1.0*pow(M_PI, 3)*pow(t, 3.5)*pow(cos(2*M_PI*x(2)), 3)*pow(cyl_bessel_j(0, 2*M_PI*t), 2)*cyl_bessel_j(1, 2*M_PI*t) + 1.0*pow(M_PI, 3)*pow(t, 3.5)*pow(cos(2*M_PI*x(2)), 3)*pow(cyl_bessel_j(1, 2*M_PI*t), 3) + 8.0*pow(M_PI, 3)*pow(t, 3.5)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) + 1.0*pow(M_PI, 3)*pow(t, 3.5)*cos(2*M_PI*x(2))*pow(cyl_bessel_j(0, 2*M_PI*t), 2)*cyl_bessel_j(1, 2*M_PI*t) - 4.0*pow(M_PI, 3)*pow(t, 3.5)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t))*exp(-0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t))
1434 );
1435 };
1436
1438 gowdy_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1439 return Eigen::Vector3d(
1440 0,
1441 pow(t, -2.0)*(0.125*sqrt(t) - 0.25*M_PI*pow(t, 1.5)*cos(2*M_PI*x(2))*cyl_bessel_j(1, 2*M_PI*t) + 1.5*pow(M_PI, 2)*pow(t, 2.5)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*pow(M_PI, 2)*pow(t, 2.5)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 2.0*pow(M_PI, 2)*pow(t, 2.5)*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) - 1.5*pow(M_PI, 2)*pow(t, 2.5)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 1.0*pow(M_PI, 3)*pow(t, 3.5)*pow(cos(2*M_PI*x(2)), 3)*pow(cyl_bessel_j(0, 2*M_PI*t), 2)*cyl_bessel_j(1, 2*M_PI*t) + 1.0*pow(M_PI, 3)*pow(t, 3.5)*pow(cos(2*M_PI*x(2)), 3)*pow(cyl_bessel_j(1, 2*M_PI*t), 3) - 8.0*pow(M_PI, 3)*pow(t, 3.5)*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) + 1.0*pow(M_PI, 3)*pow(t, 3.5)*cos(2*M_PI*x(2))*pow(cyl_bessel_j(0, 2*M_PI*t), 2)*cyl_bessel_j(1, 2*M_PI*t) + 4.0*pow(M_PI, 3)*pow(t, 3.5)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t))*exp(0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)),
1442 0
1443 );
1444 };
1445
1447 gowdy_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1448 return Eigen::Vector3d(
1449 pow(t, -0.75)*(1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cos(2*M_PI*x(2)), 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) - 1.0*pow(M_PI, 2)*pow(t, 2.0)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) + 0.25)*exp(M_PI*(-0.5*M_PI*pow(t, 2)*pow(cyl_bessel_j(0, 2*M_PI*t), 2) - 0.5*M_PI*pow(t, 2)*pow(cyl_bessel_j(1, 2*M_PI*t), 2) + 0.5*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.25*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI) + 0.5*M_PI*pow(cyl_bessel_j(1, 2*M_PI), 2) + 0.5*M_PI*pow(cyl_bessel_j(0, 2*M_PI), 2))), 0,
1450 0
1451 );
1452 };
1453
1455
1457 gowdy_B0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1458 return Eigen::Vector3d(
1459 0,
1460 0,
1461 0
1462 );
1463 };
1464
1466 gowdy_B1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1467 return Eigen::Vector3d(
1468 0,
1469 1.0*M_PI*sqrt(t)*exp(0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t))*sin(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t),
1470 0
1471 );
1472 };
1473
1475 gowdy_B2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1476 return Eigen::Vector3d(
1477 0,
1478 0,
1479 -1.0*M_PI*sqrt(t)*exp(-0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t))*sin(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)
1480 );
1481 };
1482
1484 gowdy_B3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1485 return Eigen::Vector3d(
1486 0,
1487 0,
1488 0
1489 );
1490 };
1491
1493
1495 gowdy_dtB0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1496 return Eigen::Vector3d(
1497 0,
1498 0,
1499 0
1500 );
1501 };
1502
1504 gowdy_dtB1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1505 return Eigen::Vector3d(
1506 0,
1507 M_PI*pow(t, -0.5)*(-M_PI*pow(t, 1.0)*(1.0*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) + 2.0)*cyl_bessel_j(1, 2*M_PI*t) + 0.5*cyl_bessel_j(0, 2*M_PI*t))*exp(0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t))*sin(2*M_PI*x(2)),
1508 0
1509 );
1510 };
1511
1513 gowdy_dtB2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1514 return Eigen::Vector3d(
1515 0,
1516 0,
1517 M_PI*pow(t, -0.5)*(M_PI*pow(t, 1.0)*(-1.0*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t) + 2.0)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*cyl_bessel_j(0, 2*M_PI*t))*exp(-0.5*cos(2*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t))*sin(2*M_PI*x(2))
1518 );
1519 };
1520
1522 gowdy_dtB3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1523 return Eigen::Vector3d(
1524 0,
1525 0,
1526 0
1527 );
1528 };
1529
1531
1532 //------------------------------------------------------------------------------
1533 // Linear solution (D, theta, B)
1534 //------------------------------------------------------------------------------
1535
1537 linear_lapse = [](const double t, const Eigen::Vector3d & x) -> double {
1538 return pow(t, 3)*pow(x(0), 2)*x(1) + pow(t, 3)*pow(x(0), 2)*x(2) + pow(t, 3)*x(0)*pow(x(1), 2) + 2*pow(t, 3)*x(0)*x(1)*x(2) + pow(t, 3)*x(0)*pow(x(2), 2) + pow(t, 3)*pow(x(1), 2)*x(2) + pow(t, 3)*x(1)*pow(x(2), 2) + pow(t, 2)*pow(x(0), 2) + 3*pow(t, 2)*x(0)*x(1) + 3*pow(t, 2)*x(0)*x(2) + pow(t, 2)*pow(x(1), 2) + 3*pow(t, 2)*x(1)*x(2) + pow(t, 2)*pow(x(2), 2) + 2*t*x(0) + 2*t*x(1) + 2*t*x(2) + 1;
1539 };
1540
1542 linear_theta0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1543 return Eigen::Vector3d(0, 0, 0);
1544 };
1545
1547 linear_theta1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1548 return Eigen::Vector3d(t*(x(0) + x(1)) + 1, 0, 0);
1549 };
1550
1552 linear_theta2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1553 return Eigen::Vector3d(0, t*(x(1) + x(2)) + 1, 0);
1554 };
1555
1557 linear_theta3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1558 return Eigen::Vector3d(0, 0, t*(x(0) + x(2)) + 1);
1559 };
1560
1562
1565 linear_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1566 return Eigen::Vector3d(0, 0, 0);
1567 };
1568
1570 linear_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1571 return Eigen::Vector3d(1.0*x(0) + 1.0*x(1), 0, 0);
1572 };
1573
1575 linear_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1576 return Eigen::Vector3d(0, 1.0*x(1) + 1.0*x(2), 0);
1577 };
1578
1580 linear_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1581 return Eigen::Vector3d(0, 0, 1.0*x(0) + 1.0*x(2));
1582 };
1583
1585
1586 //------------------------------------------------------------------------------
1589 deth_linear_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1590 return Eigen::Vector3d(t*(-2*t*x(0) - t*x(1) - t*x(2) - 2)/(pow(t, 2)*pow(x(0), 2) + pow(t, 2)*x(0)*x(1) + pow(t, 2)*x(0)*x(2) + pow(t, 2)*x(1)*x(2) + 2*t*x(0) + t*x(1) + t*x(2) + 1), t*(-t*x(0) - 2*t*x(1) - t*x(2) - 2)/(pow(t, 2)*x(0)*x(1) + pow(t, 2)*x(0)*x(2) + pow(t, 2)*pow(x(1), 2) + pow(t, 2)*x(1)*x(2) + t*x(0) + 2*t*x(1) + t*x(2) + 1), t*(-t*x(0) - t*x(1) - 2*t*x(2) - 2)/(pow(t, 2)*x(0)*x(1) + pow(t, 2)*x(0)*x(2) + pow(t, 2)*x(1)*x(2) + pow(t, 2)*pow(x(2), 2) + t*x(0) + t*x(1) + 2*t*x(2) + 1));
1591 };
1592
1594 deth_linear_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1595 return Eigen::Vector3d((x(0) + x(1))/(pow(t, 3)*pow(x(0), 2)*x(1) + pow(t, 3)*pow(x(0), 2)*x(2) + pow(t, 3)*x(0)*pow(x(1), 2) + 2*pow(t, 3)*x(0)*x(1)*x(2) + pow(t, 3)*x(0)*pow(x(2), 2) + pow(t, 3)*pow(x(1), 2)*x(2) + pow(t, 3)*x(1)*pow(x(2), 2) + pow(t, 2)*pow(x(0), 2) + 3*pow(t, 2)*x(0)*x(1) + 3*pow(t, 2)*x(0)*x(2) + pow(t, 2)*pow(x(1), 2) + 3*pow(t, 2)*x(1)*x(2) + pow(t, 2)*pow(x(2), 2) + 2*t*x(0) + 2*t*x(1) + 2*t*x(2) + 1), 0, 0);
1596 };
1597
1599 deth_linear_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1600 return Eigen::Vector3d(0, (x(1) + x(2))/(pow(t, 3)*pow(x(0), 2)*x(1) + pow(t, 3)*pow(x(0), 2)*x(2) + pow(t, 3)*x(0)*pow(x(1), 2) + 2*pow(t, 3)*x(0)*x(1)*x(2) + pow(t, 3)*x(0)*pow(x(2), 2) + pow(t, 3)*pow(x(1), 2)*x(2) + pow(t, 3)*x(1)*pow(x(2), 2) + pow(t, 2)*pow(x(0), 2) + 3*pow(t, 2)*x(0)*x(1) + 3*pow(t, 2)*x(0)*x(2) + pow(t, 2)*pow(x(1), 2) + 3*pow(t, 2)*x(1)*x(2) + pow(t, 2)*pow(x(2), 2) + 2*t*x(0) + 2*t*x(1) + 2*t*x(2) + 1), 0);
1601 };
1602
1604 deth_linear_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1605 return Eigen::Vector3d(0, 0, (x(0) + x(2))/(pow(t, 3)*pow(x(0), 2)*x(1) + pow(t, 3)*pow(x(0), 2)*x(2) + pow(t, 3)*x(0)*pow(x(1), 2) + 2*pow(t, 3)*x(0)*x(1)*x(2) + pow(t, 3)*x(0)*pow(x(2), 2) + pow(t, 3)*pow(x(1), 2)*x(2) + pow(t, 3)*x(1)*pow(x(2), 2) + pow(t, 2)*pow(x(0), 2) + 3*pow(t, 2)*x(0)*x(1) + 3*pow(t, 2)*x(0)*x(2) + pow(t, 2)*pow(x(1), 2) + 3*pow(t, 2)*x(1)*x(2) + pow(t, 2)*pow(x(2), 2) + 2*t*x(0) + 2*t*x(1) + 2*t*x(2) + 1));
1606 };
1607
1609
1610 //------------------------------------------------------------------------------
1611
1613 linear_dE0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1614 return Eigen::Vector3d(0, 0, 0);
1615 };
1616
1618 linear_dE1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1619 return Eigen::Vector3d(-1.0, 0, 0);
1620 };
1621
1623 linear_dE2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1624 return Eigen::Vector3d(0, 0, -1.0);
1625 };
1626
1628 linear_dE3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1629 return Eigen::Vector3d(0, 1.0, 0);
1630 };
1631
1633
1634 //------------------------------------------------------------------------------
1635
1637 linear_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1638 return Eigen::Vector3d(t*(t*x(0) + t*x(1) + 1)/(t*x(0) + t*x(2) + 1), t*(-t*x(0) - t*x(2) - 1)/(t*x(1) + t*x(2) + 1), t*(t*x(1) + t*x(2) + 1)/(t*x(0) + t*x(1) + 1));
1639 };
1640
1642 linear_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1643 return Eigen::Vector3d(0, 0, 2.0*t*x(0)*x(1) + 2.0*t*x(0)*x(2) + 2.0*t*x(1)*x(2) + 2.0*t*pow(x(2), 2) + 1.0*x(0) + 1.0*x(1) + 2.0*x(2));
1644 };
1645
1647 linear_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1648 return Eigen::Vector3d(0, -2.0*t*pow(x(0), 2) - 2.0*t*x(0)*x(1) - 2.0*t*x(0)*x(2) - 2.0*t*x(1)*x(2) - 2.0*x(0) - 1.0*x(1) - 1.0*x(2), 0);
1649 };
1650
1652 linear_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1653 return Eigen::Vector3d(2.0*t*x(0)*x(1) + 2.0*t*x(0)*x(2) + 2.0*t*pow(x(1), 2) + 2.0*t*x(1)*x(2) + 1.0*x(0) + 2.0*x(1) + 1.0*x(2), 0, 0);
1654 };
1655
1657
1658 //------------------------------------------------------------------------------
1659
1662 linear_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1663 return Eigen::Vector3d(0, 0, 0);
1664 };
1665
1667 linear_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1668 return Eigen::Vector3d(0, 0, 2.0*x(0)*x(1) + 2.0*x(0)*x(2) + 2.0*x(1)*x(2) + 2.0*pow(x(2), 2));
1669 };
1670
1672 linear_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1673 return Eigen::Vector3d(0, -2.0*pow(x(0), 2) - 2.0*x(0)*x(1) - 2.0*x(0)*x(2) - 2.0*x(1)*x(2), 0);
1674 };
1675
1677 linear_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1678 return Eigen::Vector3d(2.0*x(0)*x(1) + 2.0*x(0)*x(2) + 2.0*pow(x(1), 2) + 2.0*x(1)*x(2), 0, 0);
1679 };
1680
1682
1683//------------------------------------------------------------------------------
1684
1686 linear_B0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1687 return Eigen::Vector3d(0, 0, 0);
1688 };
1689
1691 linear_B1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1692 return Eigen::Vector3d(-t, 0, 0);
1693 };
1694
1696 linear_B2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1697 return Eigen::Vector3d(0, 0, -t);
1698 };
1699
1701 linear_B3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1702 return Eigen::Vector3d(0, t, 0);
1703 };
1704
1706
1708 linear_dtB0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1709 return Eigen::Vector3d(0, 0, 0);
1710 };
1711
1713 linear_dtB1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1714 return Eigen::Vector3d(-1, 0, 0);
1715 };
1716
1718 linear_dtB2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1719 return Eigen::Vector3d(0, 0, -1);
1720 };
1721
1723 linear_dtB3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1724 return Eigen::Vector3d(0, 1, 0);
1725 };
1726
1728
1730 linear_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1731 return Eigen::Vector3d(0, 0, 0);
1732 };
1733
1735 linear_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1736 return Eigen::Vector3d(0, -t/(t*x(0) + t*x(2) + 1), 0);
1737 };
1738
1740 linear_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1741 return Eigen::Vector3d(0, 0, -t/(t*x(0) + t*x(1) + 1));
1742 };
1743
1745 linear_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1746 return Eigen::Vector3d(-t/(t*x(1) + t*x(2) + 1), 0, 0);
1747 };
1748
1750
1752 linear_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1753 return Eigen::Vector3d(0, 0, 0);
1754 };
1755
1757 linear_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1758 return Eigen::Vector3d(pow(t, 2)/pow(t*x(0) + t*x(2) + 1, 2), 0, -pow(t, 2)/(pow(t, 2)*pow(x(0), 2) + 2*pow(t, 2)*x(0)*x(2) + pow(t, 2)*pow(x(2), 2) + 2*t*x(0) + 2*t*x(2) + 1));
1759 };
1760
1762 linear_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1763 return Eigen::Vector3d(0, pow(t, 2)/(pow(t, 2)*pow(x(0), 2) + 2*pow(t, 2)*x(0)*x(1) + pow(t, 2)*pow(x(1), 2) + 2*t*x(0) + 2*t*x(1) + 1), pow(t, 2)/pow(t*x(0) + t*x(1) + 1, 2));
1764 };
1765
1767 linear_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1768 return Eigen::Vector3d(-pow(t, 2)/(pow(t, 2)*pow(x(1), 2) + 2*pow(t, 2)*x(1)*x(2) + pow(t, 2)*pow(x(2), 2) + 2*t*x(1) + 2*t*x(2) + 1), pow(t, 2)*(-t*(x(0) + x(1)) - 1)/((t*x(0) + t*x(1) + 1)*pow(t*x(1) + t*x(2) + 1, 2)), 0);
1769 };
1770
1772
1773 //------------------------------------------------------------------------------
1774 // Constant solution (D, theta, B)
1775 //------------------------------------------------------------------------------
1776
1778 constant_lapse = [](const double t, const Eigen::Vector3d & x) -> double {
1779 return 6*pow(t, 3) + 26*pow(t, 2) + 26*t + 6;
1780 };
1781
1783 constant_theta0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1784 return Eigen::Vector3d(0, 0, 0);
1785 };
1786
1788 constant_theta1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1789 return Eigen::Vector3d(0, 0, 3*t+1);
1790 };
1791
1793 constant_theta2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1794 return Eigen::Vector3d(2*t+2, 0, 0);
1795 };
1796
1798 constant_theta3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1799 return Eigen::Vector3d(0, t+3, 0);
1800 };
1801
1803
1804 // This is E0 = 1/N dN
1806 constant_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1807 return Eigen::Vector3d(0, 0, 0);
1808 };
1809
1811 constant_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1812 return Eigen::Vector3d(0, 0, 3.0);
1813 };
1814
1816 constant_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1817 return Eigen::Vector3d(2.0, 0, 0);
1818 };
1819
1821 constant_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1822 return Eigen::Vector3d(0, 1.0, 0);
1823 };
1824
1826
1828 constant_dE0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1829 return Eigen::Vector3d(0, 0, 0);
1830 };
1831
1833 constant_dE1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1834 return Eigen::Vector3d(0, 0, 0);
1835 };
1836
1838 constant_dE2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1839 return Eigen::Vector3d(0, 0, 0);
1840 };
1841
1843 constant_dE3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1844 return Eigen::Vector3d(0, 0, 0);
1845 };
1846
1848
1850 constant_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1851 return Eigen::Vector3d(0, 0, 0);
1852 };
1853
1855 constant_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1856 return Eigen::Vector3d(4.0*t + 8.0, 0, 0);
1857 };
1858
1860 constant_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1861 return Eigen::Vector3d(0, 0, 6.0*t + 10.0);
1862 };
1863
1865 constant_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1866 return Eigen::Vector3d(0, -12.0*t - 8.0, 0);
1867 };
1868
1870
1872 constant_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1873 return Eigen::Vector3d(0, 0, 0);
1874 };
1875
1877 constant_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1878 return Eigen::Vector3d(4.0, 0, 0);
1879 };
1880
1882 constant_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1883 return Eigen::Vector3d(0, 0, 6.0);
1884 };
1885
1887 constant_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1888 return Eigen::Vector3d(0, -12.0, 0);
1889 };
1890
1892
1894 constant_B0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1895 return Eigen::Vector3d(0, 0, 0);
1896 };
1897
1899 constant_B1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1900 return Eigen::Vector3d(0, 0, 0);
1901 };
1902
1904 constant_B2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1905 return Eigen::Vector3d(0, 0, 0);
1906 };
1907
1909 constant_B3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1910 return Eigen::Vector3d(0, 0, 0);
1911 };
1912
1914
1915//------------------------------------------------------------------------------
1916
1918 constant_dtB0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1919 return Eigen::Vector3d(0, 0, 0);
1920 };
1921
1923 constant_dtB1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1924 return Eigen::Vector3d(0, 0, 0);
1925 };
1926
1928 constant_dtB2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1929 return Eigen::Vector3d(0, 0, 0);
1930 };
1931
1933 constant_dtB3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1934 return Eigen::Vector3d(0, 0, 0);
1935 };
1936
1938
1939//------------------------------------------------------------------------------
1940
1942 constant_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1943 return Eigen::Vector3d(0, 0, 0);
1944 };
1945
1947 constant_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1948 return Eigen::Vector3d(0, 0, 0);
1949 };
1950
1952 constant_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1953 return Eigen::Vector3d(0, 0, 0);
1954 };
1955
1957 constant_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1958 return Eigen::Vector3d(0, 0, 0);
1959 };
1960
1962
1964 constant_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1965 return Eigen::Vector3d(0, 0, 0);
1966 };
1967
1969 constant_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1970 return Eigen::Vector3d(0, 0, 0);
1971 };
1972
1974 constant_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1975 return Eigen::Vector3d(0, 0, 0);
1976 };
1977
1979 constant_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1980 return Eigen::Vector3d(0, 0, 0);
1981 };
1982
1984
1985 //------------------------------------------------------------------------------
1986 // Test solution (D, theta, B)
1987 //------------------------------------------------------------------------------
1988
1990 test_lapse = [](const double t, const Eigen::Vector3d & x) -> double {
1991 return pow(t, -0.25)*exp(0.5*pow(M_PI, 2)*pow(t, 2)*(pow(cyl_bessel_j(0, 2*M_PI*t), 2) + pow(cyl_bessel_j(1, 2*M_PI*t), 2)) - 0.5*M_PI*t*pow(cos(2*M_PI*x(2)), 2)*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t) - 0.5*pow(M_PI, 2)*(pow(cyl_bessel_j(1, 2*M_PI), 2) + pow(cyl_bessel_j(0, 2*M_PI), 2)) + 0.25*M_PI*cyl_bessel_j(0, 2*M_PI)*cyl_bessel_j(1, 2*M_PI));
1992 };
1993
1995 test_theta0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
1996 return Eigen::Vector3d(0, 0, 0);
1997 };
1998
2000 test_theta1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2001 return Eigen::Vector3d(1, 0, 0);
2002 };
2003
2005 test_theta2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2006 return Eigen::Vector3d(0, 1, 0);
2007 };
2008
2010 test_theta3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2011 return Eigen::Vector3d(0, 0, 1);
2012 };
2013
2015
2016 // This is E0 = 1/N dN
2018 test_E0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2019 return Eigen::Vector3d(0, 0, -1.0*pow(M_PI, 2)*pow(t, 1.0)*sin(4*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t));
2020 };
2021
2023 test_E1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2024 return Eigen::Vector3d(0, 0, 0);
2025 };
2026
2028 test_E2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2029 return Eigen::Vector3d(0, 0, 0);
2030 };
2031
2033 test_E3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2034 return Eigen::Vector3d(0, 0, 0);
2035 };
2036
2038
2040 test_dE0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2041 return Eigen::Vector3d(0, 0, 0);
2042 };
2043
2045 test_dE1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2046 return Eigen::Vector3d(0, 0, 0);
2047 };
2048
2050 test_dE2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2051 return Eigen::Vector3d(0, 0, 0);
2052 };
2053
2055 test_dE3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2056 return Eigen::Vector3d(0, 0, 0);
2057 };
2058
2060
2062 test_D0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2063 return Eigen::Vector3d(0, 0, 0);
2064 };
2065
2067 test_D1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2068 return Eigen::Vector3d(0, 0, 0);
2069 };
2070
2072 test_D2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2073 return Eigen::Vector3d(0, 0, 0);
2074 };
2075
2077 test_D3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2078 return Eigen::Vector3d(0, 0, 0);
2079 };
2080
2082
2084 test_dtD0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2085 return Eigen::Vector3d(0, 0, 0);
2086 };
2087
2089 test_dtD1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2090 return Eigen::Vector3d(0, 0, 0);
2091 };
2092
2094 test_dtD2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2095 return Eigen::Vector3d(0, 0, 0);
2096 };
2097
2099 test_dtD3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2100 return Eigen::Vector3d(0, 0, 0);
2101 };
2102
2104
2106 test_B0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2107 return Eigen::Vector3d(0, 0, 0);
2108 };
2109
2111 test_B1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2112 return Eigen::Vector3d(0, 0, 0);
2113 };
2114
2116 test_B2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2117 return Eigen::Vector3d(0, 0, 0);
2118 };
2119
2121 test_B3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2122 return Eigen::Vector3d(0, 0, 0);
2123 };
2124
2126
2128 test_dtB0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2129 return Eigen::Vector3d(0, 0, 0);
2130 };
2131
2133 test_dtB1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2134 return Eigen::Vector3d(0, 0, 0);
2135 };
2136
2138 test_dtB2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2139 return Eigen::Vector3d(0, 0, 0);
2140 };
2141
2143 test_dtB3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2144 return Eigen::Vector3d(0, 0, 0);
2145 };
2146
2148
2149//------------------------------------------------------------------------------
2150
2152 test_H0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2153 return Eigen::Vector3d(0, 0, 0);
2154 };
2155
2157 test_H1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2158 return Eigen::Vector3d(0, -1.0*pow(M_PI, 2)*pow(t, 1.0)*sin(4*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t), 0);
2159 };
2160
2162 test_H2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2163 return Eigen::Vector3d(1.0*pow(M_PI, 2)*pow(t, 1.0)*sin(4*M_PI*x(2))*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t), 0, 0);
2164 };
2165
2167 test_H3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2168 return Eigen::Vector3d(0, 0, 0);
2169 };
2170
2172
2174 test_dH0 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2175 return Eigen::Vector3d(0, 0, 0);
2176 };
2177
2179 test_dH1 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2180 return Eigen::Vector3d(0, 0, 4.0*pow(M_PI, 3)*pow(t, 1.0)*(-pow(sin(2*M_PI*x(2)), 2) + pow(cos(2*M_PI*x(2)), 2))*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t));
2181 };
2182
2184 test_dH2 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2185 return Eigen::Vector3d(0, 4.0*pow(M_PI, 3)*pow(t, 1.0)*(pow(sin(2*M_PI*x(2)), 2) - pow(cos(2*M_PI*x(2)), 2))*cyl_bessel_j(0, 2*M_PI*t)*cyl_bessel_j(1, 2*M_PI*t), 0);
2186 };
2187
2189 test_dH3 = [](const double t, const Eigen::Vector3d & x) -> Eigen::Vector3d {
2190 return Eigen::Vector3d(0, 0, 0);
2191 };
2192
2194
2195//------------------------------------------------------------------------------
2196
2197} // end of namespace HArDCore3D
2198
2199#endif
Definition ddr_spaces.hpp:19
This structure is a wrapper to allow a given code to select various linear solvers.
Definition linearsolver.hpp:106
@ Matrix
Definition basis.hpp:67
size_t dimension() const
Returns the dimension of the global space (all DOFs for all geometric entities)
Definition localdofspace.hpp:80
static const double PI
Definition ddr-magnetostatics.hpp:187
bool use_threads
Definition HHO_DiffAdvecReac.hpp:47
GlobalDOFSpace const & dofspace(size_t k) const
Returns the dofspace associated to discrete k-forms.
Definition ddr_spaces.hpp:52
Definition PastixInterface.hpp:16
Definition ddr-magnetostatics.hpp:41
static Einstein::TTwoFormType constant_D0
Definition ecddr-einstein-dtb.hpp:1850
static Einstein::TCollection1Forms linear_dE
Definition ecddr-einstein-dtb.hpp:1632
static Einstein::TTwoFormType kasner_D0
Definition ecddr-einstein-dtb.hpp:962
static Einstein::TOneFormType linear_E0
This is E0 = 1/N dN.
Definition ecddr-einstein-dtb.hpp:1565
static Einstein::TOneFormType kasner_H0
Definition ecddr-einstein-dtb.hpp:1084
static Einstein::TCollection1Forms test_H
Definition ecddr-einstein-dtb.hpp:2171
static Einstein::TOneFormType linear_H1
Definition ecddr-einstein-dtb.hpp:1735
static Einstein::TTwoFormType gowdy_dtD3
Definition ecddr-einstein-dtb.hpp:1447
static Einstein::TCollection2Forms constant_B
Definition ecddr-einstein-dtb.hpp:1913
static Einstein::TTwoFormType minkowski_dE3
Definition ecddr-einstein-dtb.hpp:643
static Einstein::TTwoFormType minkowski_B0
Definition ecddr-einstein-dtb.hpp:654
static Einstein::TCollection2Forms kasner_dH
Definition ecddr-einstein-dtb.hpp:1152
static Einstein::TOneFormType deth_kasner_E2
Definition ecddr-einstein-dtb.hpp:948
static Einstein::TOneFormType gowdy_theta1
Definition ecddr-einstein-dtb.hpp:1198
static Einstein::TTwoFormType minkowski_dE1
Definition ecddr-einstein-dtb.hpp:625
static Einstein::TOneFormType deth_linear_E3
Definition ecddr-einstein-dtb.hpp:1604
static Einstein::TTwoFormType deth_kasner_dtD0
Definition ecddr-einstein-dtb.hpp:1036
static Einstein::TOneFormType linear_dE0
Definition ecddr-einstein-dtb.hpp:1613
static Einstein::TTwoFormType linear_D2
Definition ecddr-einstein-dtb.hpp:1647
static Einstein::TOneFormType kasner_theta1
Definition ecddr-einstein-dtb.hpp:896
static Einstein::TTwoFormType gowdy_dH2
Definition ecddr-einstein-dtb.hpp:1362
static Einstein::TTwoFormType test_dtD0
Definition ecddr-einstein-dtb.hpp:2084
static Einstein::TCollection1Forms kasner_theta
Definition ecddr-einstein-dtb.hpp:910
static Einstein::TTwoFormType kasner_D2
Definition ecddr-einstein-dtb.hpp:972
static Einstein::TTwoFormType linear_dtD1
Definition ecddr-einstein-dtb.hpp:1667
static Einstein::TOneFormType gowdy_E1
Definition ecddr-einstein-dtb.hpp:1239
static Einstein::TCollection2Forms linear_D
Definition ecddr-einstein-dtb.hpp:1656
static Einstein::TCollection2Forms test_B
Definition ecddr-einstein-dtb.hpp:2125
static Einstein::TTwoFormType gowdy_dtD1
Definition ecddr-einstein-dtb.hpp:1429
static Einstein::TCollection1Forms linear_H
Definition ecddr-einstein-dtb.hpp:1749
static Einstein::TTwoFormType test_dH1
Definition ecddr-einstein-dtb.hpp:2179
static Einstein::TTwoFormType minkowski_dH3
Definition ecddr-einstein-dtb.hpp:871
static Einstein::TOneFormType constant_H3
Definition ecddr-einstein-dtb.hpp:1957
static Einstein::TTwoFormType kasner_dH1
Definition ecddr-einstein-dtb.hpp:1138
static Einstein::TTwoFormType test_D2
Definition ecddr-einstein-dtb.hpp:2072
static Einstein::TOneFormType test_dE1
Definition ecddr-einstein-dtb.hpp:2045
static Einstein::TZeroFormType kasner_lapse
Definition ecddr-einstein-dtb.hpp:886
static Einstein::TZeroFormType gowdy_lapse
Definition ecddr-einstein-dtb.hpp:1184
static Einstein::TOneFormType constant_theta3
Definition ecddr-einstein-dtb.hpp:1798
static Einstein::TCollection1Forms test_E
Definition ecddr-einstein-dtb.hpp:2037
static Einstein::TTwoFormType linear_dH1
Definition ecddr-einstein-dtb.hpp:1757
static Einstein::TTwoFormType kasner_dtD1
Definition ecddr-einstein-dtb.hpp:1016
static Einstein::TOneFormType gowdy_E3
Definition ecddr-einstein-dtb.hpp:1257
static Einstein::TTwoFormType test_dH2
Definition ecddr-einstein-dtb.hpp:2184
static Einstein::TOneFormType kasner_theta2
Definition ecddr-einstein-dtb.hpp:901
static Einstein::TOneFormType linear_theta3
Definition ecddr-einstein-dtb.hpp:1557
static Einstein::TOneFormType kasner_E3
Definition ecddr-einstein-dtb.hpp:929
static Einstein::TTwoFormType minkowski_dtB1
Definition ecddr-einstein-dtb.hpp:701
static Einstein::TCollection1Forms minkowski_theta
Definition ecddr-einstein-dtb.hpp:575
static Einstein::TOneFormType deth_kasner_E0
Definition ecddr-einstein-dtb.hpp:938
static Einstein::TTwoFormType test_D1
Definition ecddr-einstein-dtb.hpp:2067
static Einstein::TOneFormType test_E1
Definition ecddr-einstein-dtb.hpp:2023
static Einstein::TCollection2Forms kasner_D
Definition ecddr-einstein-dtb.hpp:981
static Einstein::TTwoFormType gowdy_dE2
Definition ecddr-einstein-dtb.hpp:1286
static Einstein::TCollection1Forms constant_E
Definition ecddr-einstein-dtb.hpp:1825
static Einstein::TZeroFormType constant_lapse
Definition ecddr-einstein-dtb.hpp:1778
static Einstein::TCollection1Forms minkowski_dH
Definition ecddr-einstein-dtb.hpp:879
static Einstein::TCollection2Forms kasner_B
Definition ecddr-einstein-dtb.hpp:1079
static Einstein::TTwoFormType minkowski_dH0
Definition ecddr-einstein-dtb.hpp:844
static Einstein::TCollection2Forms test_dtB
Definition ecddr-einstein-dtb.hpp:2147
static Einstein::TOneFormType linear_E2
Definition ecddr-einstein-dtb.hpp:1575
static Einstein::TCollection1Forms gowdy_theta
Definition ecddr-einstein-dtb.hpp:1227
static Einstein::TTwoFormType gowdy_B3
Definition ecddr-einstein-dtb.hpp:1484
static Einstein::TTwoFormType kasner_B1
Definition ecddr-einstein-dtb.hpp:1065
static Einstein::TOneFormType constant_E2
Definition ecddr-einstein-dtb.hpp:1816
static Einstein::TTwoFormType constant_dtD1
Definition ecddr-einstein-dtb.hpp:1877
static Einstein::TTwoFormType minkowski_dH2
Definition ecddr-einstein-dtb.hpp:862
static Einstein::TTwoFormType test_dtB3
Definition ecddr-einstein-dtb.hpp:2143
static Einstein::TTwoFormType gowdy_dtB2
Definition ecddr-einstein-dtb.hpp:1513
static Einstein::TTwoFormType deth_kasner_dH2
Definition ecddr-einstein-dtb.hpp:1168
static Einstein::TCollection1Forms deth_linear_E
Definition ecddr-einstein-dtb.hpp:1608
static Einstein::TTwoFormType linear_dtD2
Definition ecddr-einstein-dtb.hpp:1672
static Einstein::TTwoFormType constant_dtD0
Definition ecddr-einstein-dtb.hpp:1872
static Einstein::TTwoFormType gowdy_dH1
Definition ecddr-einstein-dtb.hpp:1353
static Einstein::TOneFormType constant_theta2
Definition ecddr-einstein-dtb.hpp:1793
static Einstein::TTwoFormType constant_dtB2
Definition ecddr-einstein-dtb.hpp:1928
static Einstein::TTwoFormType linear_B3
Definition ecddr-einstein-dtb.hpp:1701
static Einstein::TCollection2Forms constant_dtB
Definition ecddr-einstein-dtb.hpp:1937
static Einstein::TOneFormType kasner_E0
Definition ecddr-einstein-dtb.hpp:914
static Einstein::TCollection2Forms minkowski_D
Definition ecddr-einstein-dtb.hpp:765
static Einstein::TTwoFormType minkowski_dE2
Definition ecddr-einstein-dtb.hpp:634
static Einstein::TOneFormType constant_theta1
Definition ecddr-einstein-dtb.hpp:1788
static Einstein::TTwoFormType minkowski_dE0
Definition ecddr-einstein-dtb.hpp:616
static Einstein::TTwoFormType gowdy_D2
Definition ecddr-einstein-dtb.hpp:1400
static Einstein::TOneFormType deth_kasner_H0
Definition ecddr-einstein-dtb.hpp:1109
static Einstein::TZeroFormType linear_lapse
Definition ecddr-einstein-dtb.hpp:1537
static Einstein::TCollection1Forms kasner_H
Definition ecddr-einstein-dtb.hpp:1103
static Einstein::TOneFormType gowdy_H0
Definition ecddr-einstein-dtb.hpp:1306
static Einstein::TTwoFormType kasner_D1
Definition ecddr-einstein-dtb.hpp:967
static Einstein::TTwoFormType linear_dH0
Definition ecddr-einstein-dtb.hpp:1752
static Einstein::TTwoFormType minkowski_B1
Definition ecddr-einstein-dtb.hpp:663
static Einstein::TOneFormType gowdy_H1
Definition ecddr-einstein-dtb.hpp:1315
static Einstein::TTwoFormType minkowski_D1
Definition ecddr-einstein-dtb.hpp:739
static Einstein::TOneFormType constant_dE3
Definition ecddr-einstein-dtb.hpp:1843
static Einstein::TCollection2Forms linear_dtB
Definition ecddr-einstein-dtb.hpp:1727
static Einstein::TTwoFormType test_B2
Definition ecddr-einstein-dtb.hpp:2116
static Einstein::TCollection1Forms constant_H
Definition ecddr-einstein-dtb.hpp:1961
static Einstein::TOneFormType linear_dE3
Definition ecddr-einstein-dtb.hpp:1628
static Einstein::TCollection2Forms constant_D
Definition ecddr-einstein-dtb.hpp:1869
static Einstein::TOneFormType minkowski_H2
Definition ecddr-einstein-dtb.hpp:824
static Einstein::TTwoFormType deth_kasner_D1
Definition ecddr-einstein-dtb.hpp:992
static Einstein::TTwoFormType kasner_dH2
Definition ecddr-einstein-dtb.hpp:1143
static Einstein::TTwoFormType gowdy_dE0
Definition ecddr-einstein-dtb.hpp:1268
static Einstein::TTwoFormType minkowski_B2
Definition ecddr-einstein-dtb.hpp:672
static Einstein::TOneFormType linear_dE2
Definition ecddr-einstein-dtb.hpp:1623
static Einstein::TCollection1Forms test_dE
Definition ecddr-einstein-dtb.hpp:2059
static Einstein::TOneFormType test_H2
Definition ecddr-einstein-dtb.hpp:2162
static Einstein::TOneFormType linear_H0
Definition ecddr-einstein-dtb.hpp:1730
static Einstein::TTwoFormType kasner_B0
Definition ecddr-einstein-dtb.hpp:1060
static Einstein::TOneFormType linear_theta0
Definition ecddr-einstein-dtb.hpp:1542
static Einstein::TTwoFormType linear_dtB3
Definition ecddr-einstein-dtb.hpp:1723
static Einstein::TOneFormType test_dE0
Definition ecddr-einstein-dtb.hpp:2040
static Einstein::TOneFormType deth_kasner_E3
Definition ecddr-einstein-dtb.hpp:953
static Einstein::TCollection1Forms gowdy_H
Definition ecddr-einstein-dtb.hpp:1341
static Einstein::TOneFormType kasner_H2
Definition ecddr-einstein-dtb.hpp:1094
static Einstein::TCollection2Forms gowdy_B
Definition ecddr-einstein-dtb.hpp:1492
static Einstein::TOneFormType linear_H3
Definition ecddr-einstein-dtb.hpp:1745
static Einstein::TOneFormType minkowski_theta1
Definition ecddr-einstein-dtb.hpp:549
static Einstein::TCollection1Forms gowdy_dE
Definition ecddr-einstein-dtb.hpp:1303
static Einstein::TCollection1Forms kasner_E
Definition ecddr-einstein-dtb.hpp:933
static Einstein::TTwoFormType minkowski_dtD2
Definition ecddr-einstein-dtb.hpp:786
static Einstein::TTwoFormType constant_D1
Definition ecddr-einstein-dtb.hpp:1855
static Einstein::TZeroFormType test_lapse
Definition ecddr-einstein-dtb.hpp:1990
static Einstein::TCollection1Forms linear_theta
Definition ecddr-einstein-dtb.hpp:1561
static Einstein::TTwoFormType minkowski_dtD1
Definition ecddr-einstein-dtb.hpp:777
static Einstein::TCollection2Forms minkowski_dtB
Definition ecddr-einstein-dtb.hpp:727
static Einstein::TTwoFormType deth_kasner_dH0
Definition ecddr-einstein-dtb.hpp:1158
static Einstein::TTwoFormType gowdy_D0
Definition ecddr-einstein-dtb.hpp:1382
static Einstein::TTwoFormType test_dtD1
Definition ecddr-einstein-dtb.hpp:2089
static Einstein::TTwoFormType test_B1
Definition ecddr-einstein-dtb.hpp:2111
static Einstein::TCollection2Forms deth_kasner_dtD
Definition ecddr-einstein-dtb.hpp:1055
static Einstein::TTwoFormType test_B3
Definition ecddr-einstein-dtb.hpp:2121
static Einstein::TTwoFormType minkowski_dtB3
Definition ecddr-einstein-dtb.hpp:719
static Einstein::TCollection2Forms constant_dH
Definition ecddr-einstein-dtb.hpp:1983
static Einstein::TOneFormType kasner_theta3
Definition ecddr-einstein-dtb.hpp:906
static Einstein::TTwoFormType linear_dH2
Definition ecddr-einstein-dtb.hpp:1762
static Einstein::TTwoFormType test_D0
Definition ecddr-einstein-dtb.hpp:2062
static Einstein::TOneFormType constant_E1
Definition ecddr-einstein-dtb.hpp:1811
static Einstein::TOneFormType test_theta2
Definition ecddr-einstein-dtb.hpp:2005
static Einstein::TTwoFormType linear_dtB2
Definition ecddr-einstein-dtb.hpp:1718
static Einstein::TTwoFormType minkowski_B3
Definition ecddr-einstein-dtb.hpp:681
static Einstein::TOneFormType gowdy_theta0
Definition ecddr-einstein-dtb.hpp:1189
static Einstein::TTwoFormType linear_D3
Definition ecddr-einstein-dtb.hpp:1652
static Einstein::TTwoFormType minkowski_dH1
Definition ecddr-einstein-dtb.hpp:853
static Einstein::TTwoFormType kasner_D3
Definition ecddr-einstein-dtb.hpp:977
static Einstein::TZeroFormType minkowski_lapse
Definition ecddr-einstein-dtb.hpp:535
static Einstein::TOneFormType minkowski_E3
Definition ecddr-einstein-dtb.hpp:605
static Einstein::TCollection1Forms minkowski_H
Definition ecddr-einstein-dtb.hpp:841
static Einstein::TOneFormType deth_linear_E2
Definition ecddr-einstein-dtb.hpp:1599
static Einstein::TTwoFormType gowdy_dtD2
Definition ecddr-einstein-dtb.hpp:1438
static Einstein::TCollection2Forms test_dH
Definition ecddr-einstein-dtb.hpp:2193
static Einstein::TTwoFormType gowdy_dE1
Definition ecddr-einstein-dtb.hpp:1277
static Einstein::TTwoFormType constant_D2
Definition ecddr-einstein-dtb.hpp:1860
static Einstein::TTwoFormType gowdy_B0
Definition ecddr-einstein-dtb.hpp:1457
static Einstein::TOneFormType minkowski_theta3
Definition ecddr-einstein-dtb.hpp:567
static Einstein::TOneFormType linear_dE1
Definition ecddr-einstein-dtb.hpp:1618
static Einstein::TTwoFormType kasner_dtD3
Definition ecddr-einstein-dtb.hpp:1026
static Einstein::TTwoFormType test_dH0
Definition ecddr-einstein-dtb.hpp:2174
static Einstein::TCollection1Forms constant_theta
Definition ecddr-einstein-dtb.hpp:1802
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> noise(const std::function< Eigen::Vector3d(const Eigen::Vector3d &)> &f)
Definition ecddr-einstein-dtb.hpp:522
static Einstein::TOneFormType deth_linear_E0
This is E0 = 1/N dN.
Definition ecddr-einstein-dtb.hpp:1589
static Einstein::TTwoFormType test_B0
Definition ecddr-einstein-dtb.hpp:2106
static Einstein::TTwoFormType minkowski_D3
Definition ecddr-einstein-dtb.hpp:757
static Einstein::TTwoFormType deth_kasner_dH1
Definition ecddr-einstein-dtb.hpp:1163
static Einstein::TCollection1Forms linear_E
Definition ecddr-einstein-dtb.hpp:1584
static Einstein::TCollection2Forms gowdy_dtB
Definition ecddr-einstein-dtb.hpp:1530
static Einstein::TTwoFormType kasner_dtD0
Definition ecddr-einstein-dtb.hpp:1011
static Einstein::TCollection2Forms minkowski_dtD
Definition ecddr-einstein-dtb.hpp:803
static Einstein::TOneFormType test_H0
Definition ecddr-einstein-dtb.hpp:2152
static Einstein::TOneFormType test_E0
Definition ecddr-einstein-dtb.hpp:2018
static Einstein::TTwoFormType gowdy_dtD0
Definition ecddr-einstein-dtb.hpp:1420
static Einstein::TTwoFormType minkowski_dtB0
Definition ecddr-einstein-dtb.hpp:692
static Einstein::TTwoFormType gowdy_dH3
Definition ecddr-einstein-dtb.hpp:1371
static Einstein::TOneFormType minkowski_theta0
Definition ecddr-einstein-dtb.hpp:540
static Einstein::TOneFormType test_theta3
Definition ecddr-einstein-dtb.hpp:2010
static Einstein::TOneFormType kasner_E2
Definition ecddr-einstein-dtb.hpp:924
static Einstein::TTwoFormType gowdy_dH0
Definition ecddr-einstein-dtb.hpp:1344
static Einstein::TTwoFormType deth_kasner_D0
Definition ecddr-einstein-dtb.hpp:987
static Einstein::TTwoFormType gowdy_D3
Definition ecddr-einstein-dtb.hpp:1409
static Einstein::TTwoFormType constant_dtB1
Definition ecddr-einstein-dtb.hpp:1923
static Einstein::TCollection2Forms linear_dH
Definition ecddr-einstein-dtb.hpp:1771
static Einstein::TCollection2Forms linear_dtD
Definition ecddr-einstein-dtb.hpp:1681
static Einstein::TTwoFormType test_dtB2
Definition ecddr-einstein-dtb.hpp:2138
static Einstein::TOneFormType minkowski_H3
Definition ecddr-einstein-dtb.hpp:833
static Einstein::TCollection2Forms constant_dtD
Definition ecddr-einstein-dtb.hpp:1891
std::vector< Fct > starCol(const std::vector< Fct > &F)
Definition ecddr-einstein-dtb.hpp:513
static Einstein::TTwoFormType test_dtB0
Definition ecddr-einstein-dtb.hpp:2128
static Einstein::TTwoFormType linear_D0
Definition ecddr-einstein-dtb.hpp:1637
static Einstein::TOneFormType minkowski_H0
Definition ecddr-einstein-dtb.hpp:806
static Einstein::TOneFormType linear_E1
Definition ecddr-einstein-dtb.hpp:1570
static Einstein::TTwoFormType minkowski_dtD0
Definition ecddr-einstein-dtb.hpp:768
static Einstein::TTwoFormType constant_dtB0
Definition ecddr-einstein-dtb.hpp:1918
static Einstein::TTwoFormType linear_dtB1
Definition ecddr-einstein-dtb.hpp:1713
static Einstein::TCollection1Forms deth_kasner_H
Definition ecddr-einstein-dtb.hpp:1128
static Einstein::TCollection2Forms test_D
Definition ecddr-einstein-dtb.hpp:2081
static Einstein::TOneFormType minkowski_E1
Definition ecddr-einstein-dtb.hpp:587
static Einstein::TOneFormType deth_linear_E1
Definition ecddr-einstein-dtb.hpp:1594
static Einstein::TTwoFormType gowdy_dtB3
Definition ecddr-einstein-dtb.hpp:1522
static Einstein::TTwoFormType linear_B1
Definition ecddr-einstein-dtb.hpp:1691
static Einstein::TOneFormType constant_theta0
Definition ecddr-einstein-dtb.hpp:1783
static Einstein::TOneFormType linear_theta2
Definition ecddr-einstein-dtb.hpp:1552
static Einstein::TTwoFormType linear_B0
Definition ecddr-einstein-dtb.hpp:1686
static Einstein::TOneFormType constant_H2
Definition ecddr-einstein-dtb.hpp:1952
static Einstein::TCollection2Forms test_dtD
Definition ecddr-einstein-dtb.hpp:2103
static Einstein::TTwoFormType constant_dtD3
Definition ecddr-einstein-dtb.hpp:1887
static Einstein::TTwoFormType minkowski_D0
Definition ecddr-einstein-dtb.hpp:730
static Einstein::TTwoFormType test_D3
Definition ecddr-einstein-dtb.hpp:2077
static Einstein::TOneFormType deth_kasner_H1
Definition ecddr-einstein-dtb.hpp:1114
static Einstein::TOneFormType constant_E0
Definition ecddr-einstein-dtb.hpp:1806
static Einstein::TOneFormType kasner_H3
Definition ecddr-einstein-dtb.hpp:1099
static Einstein::TOneFormType constant_dE0
Definition ecddr-einstein-dtb.hpp:1828
static Einstein::TCollection2Forms gowdy_D
Definition ecddr-einstein-dtb.hpp:1417
static Einstein::TOneFormType test_dE3
Definition ecddr-einstein-dtb.hpp:2055
static Einstein::TCollection1Forms minkowski_dE
Definition ecddr-einstein-dtb.hpp:651
static Einstein::TTwoFormType deth_kasner_D3
Definition ecddr-einstein-dtb.hpp:1002
static Einstein::TOneFormType deth_kasner_H3
Definition ecddr-einstein-dtb.hpp:1124
static Einstein::TTwoFormType deth_kasner_dH3
Definition ecddr-einstein-dtb.hpp:1173
static Einstein::TOneFormType constant_E3
Definition ecddr-einstein-dtb.hpp:1821
static Einstein::TCollection2Forms linear_B
Definition ecddr-einstein-dtb.hpp:1705
static Einstein::TOneFormType gowdy_theta2
Definition ecddr-einstein-dtb.hpp:1207
static Einstein::TTwoFormType test_dtB1
Definition ecddr-einstein-dtb.hpp:2133
static Einstein::TTwoFormType test_dtD2
Definition ecddr-einstein-dtb.hpp:2094
static Einstein::TOneFormType minkowski_E2
Definition ecddr-einstein-dtb.hpp:596
static Einstein::TTwoFormType gowdy_dtB1
Definition ecddr-einstein-dtb.hpp:1504
static Einstein::TOneFormType linear_H2
Definition ecddr-einstein-dtb.hpp:1740
static Einstein::TOneFormType linear_theta1
Definition ecddr-einstein-dtb.hpp:1547
static Einstein::TTwoFormType linear_dtD0
Not calculated since not needed.
Definition ecddr-einstein-dtb.hpp:1662
static Einstein::TTwoFormType constant_B3
Definition ecddr-einstein-dtb.hpp:1909
static Einstein::TTwoFormType kasner_dtD2
Definition ecddr-einstein-dtb.hpp:1021
static Einstein::TTwoFormType minkowski_D2
Definition ecddr-einstein-dtb.hpp:748
static Einstein::TCollection2Forms gowdy_dtD
Definition ecddr-einstein-dtb.hpp:1454
static Einstein::TCollection1Forms gowdy_dH
Definition ecddr-einstein-dtb.hpp:1379
static Einstein::TOneFormType gowdy_H2
Definition ecddr-einstein-dtb.hpp:1324
static Einstein::TOneFormType deth_kasner_H2
Definition ecddr-einstein-dtb.hpp:1119
static Einstein::TTwoFormType linear_dH3
Definition ecddr-einstein-dtb.hpp:1767
static Einstein::TTwoFormType test_dH3
Definition ecddr-einstein-dtb.hpp:2189
static Einstein::TOneFormType minkowski_E0
Definition ecddr-einstein-dtb.hpp:578
static Einstein::TTwoFormType linear_B2
Definition ecddr-einstein-dtb.hpp:1696
static Einstein::TTwoFormType deth_kasner_dtD3
Definition ecddr-einstein-dtb.hpp:1051
static Einstein::TCollection1Forms minkowski_E
Definition ecddr-einstein-dtb.hpp:613
static Einstein::TTwoFormType constant_B1
Definition ecddr-einstein-dtb.hpp:1899
static Einstein::TTwoFormType linear_D1
Definition ecddr-einstein-dtb.hpp:1642
static Einstein::TTwoFormType minkowski_dtD3
Definition ecddr-einstein-dtb.hpp:795
static Einstein::TOneFormType kasner_theta0
Definition ecddr-einstein-dtb.hpp:891
static Einstein::TOneFormType kasner_E1
Definition ecddr-einstein-dtb.hpp:919
static Einstein::TTwoFormType kasner_dH0
Definition ecddr-einstein-dtb.hpp:1133
static Einstein::TTwoFormType test_dtD3
Definition ecddr-einstein-dtb.hpp:2099
static Einstein::TTwoFormType kasner_dH3
Definition ecddr-einstein-dtb.hpp:1148
static Einstein::TOneFormType gowdy_E0
Definition ecddr-einstein-dtb.hpp:1230
static Einstein::TOneFormType gowdy_H3
Definition ecddr-einstein-dtb.hpp:1333
static Einstein::TCollection1Forms test_theta
Definition ecddr-einstein-dtb.hpp:2014
static Einstein::TTwoFormType constant_B2
Definition ecddr-einstein-dtb.hpp:1904
static Einstein::TTwoFormType constant_dH2
Definition ecddr-einstein-dtb.hpp:1974
std::function< Eigen::Vector3d(double t, const Eigen::Vector3d &)> star(const std::function< Eigen::Vector3d(double t, const Eigen::Vector3d &)> &F)
Definition ecddr-einstein-dtb.hpp:500
static Einstein::TTwoFormType constant_dH1
Definition ecddr-einstein-dtb.hpp:1969
static Einstein::TOneFormType gowdy_theta3
Definition ecddr-einstein-dtb.hpp:1216
static Einstein::TCollection1Forms deth_kasner_E
Definition ecddr-einstein-dtb.hpp:957
static Einstein::TOneFormType kasner_H1
Definition ecddr-einstein-dtb.hpp:1089
static Einstein::TCollection2Forms deth_kasner_dH
Definition ecddr-einstein-dtb.hpp:1177
static Einstein::TTwoFormType gowdy_dtB0
Definition ecddr-einstein-dtb.hpp:1495
static Einstein::TCollection2Forms deth_kasner_D
Definition ecddr-einstein-dtb.hpp:1006
static Einstein::TTwoFormType linear_dtD3
Definition ecddr-einstein-dtb.hpp:1677
static Einstein::TTwoFormType constant_dH3
Definition ecddr-einstein-dtb.hpp:1979
static Einstein::TOneFormType constant_dE2
Definition ecddr-einstein-dtb.hpp:1838
static Einstein::TTwoFormType linear_dtB0
Definition ecddr-einstein-dtb.hpp:1708
static Einstein::TOneFormType constant_H0
Definition ecddr-einstein-dtb.hpp:1942
static Einstein::TCollection1Forms constant_dE
Definition ecddr-einstein-dtb.hpp:1847
static Einstein::TOneFormType test_dE2
Definition ecddr-einstein-dtb.hpp:2050
static Einstein::TTwoFormType kasner_B3
Definition ecddr-einstein-dtb.hpp:1075
static Einstein::TOneFormType deth_kasner_E1
Definition ecddr-einstein-dtb.hpp:943
static Einstein::TOneFormType test_H1
Definition ecddr-einstein-dtb.hpp:2157
static Einstein::TCollection2Forms kasner_dtD
Definition ecddr-einstein-dtb.hpp:1030
static Einstein::TTwoFormType deth_kasner_dtD2
Definition ecddr-einstein-dtb.hpp:1046
static Einstein::TTwoFormType constant_B0
Definition ecddr-einstein-dtb.hpp:1894
static Einstein::TOneFormType test_E2
Definition ecddr-einstein-dtb.hpp:2028
static Einstein::TOneFormType constant_H1
Definition ecddr-einstein-dtb.hpp:1947
static Einstein::TTwoFormType minkowski_dtB2
Definition ecddr-einstein-dtb.hpp:710
static Einstein::TCollection2Forms minkowski_B
Definition ecddr-einstein-dtb.hpp:689
static Einstein::TOneFormType test_H3
Definition ecddr-einstein-dtb.hpp:2167
static Einstein::TTwoFormType constant_dH0
Definition ecddr-einstein-dtb.hpp:1964
static Einstein::TOneFormType test_theta0
Definition ecddr-einstein-dtb.hpp:1995
static Einstein::TTwoFormType constant_D3
Definition ecddr-einstein-dtb.hpp:1865
static Einstein::TTwoFormType constant_dtD2
Definition ecddr-einstein-dtb.hpp:1882
static Einstein::TOneFormType gowdy_E2
Definition ecddr-einstein-dtb.hpp:1248
static Einstein::TOneFormType linear_E3
Definition ecddr-einstein-dtb.hpp:1580
static Einstein::TTwoFormType deth_kasner_D2
Definition ecddr-einstein-dtb.hpp:997
static Einstein::TTwoFormType gowdy_B2
Definition ecddr-einstein-dtb.hpp:1475
static Einstein::TCollection1Forms gowdy_E
Definition ecddr-einstein-dtb.hpp:1265
static Einstein::TOneFormType test_E3
Definition ecddr-einstein-dtb.hpp:2033
static Einstein::TTwoFormType gowdy_dE3
Definition ecddr-einstein-dtb.hpp:1295
static Einstein::TOneFormType minkowski_H1
Definition ecddr-einstein-dtb.hpp:815
static Einstein::TTwoFormType deth_kasner_dtD1
Definition ecddr-einstein-dtb.hpp:1041
static Einstein::TOneFormType minkowski_theta2
Definition ecddr-einstein-dtb.hpp:558
static Einstein::TTwoFormType constant_dtB3
Definition ecddr-einstein-dtb.hpp:1933
static Einstein::TOneFormType constant_dE1
Definition ecddr-einstein-dtb.hpp:1833
static Einstein::TTwoFormType gowdy_B1
Definition ecddr-einstein-dtb.hpp:1466
static Einstein::TOneFormType test_theta1
Definition ecddr-einstein-dtb.hpp:2000
static Einstein::TTwoFormType gowdy_D1
Definition ecddr-einstein-dtb.hpp:1391
static Einstein::TTwoFormType kasner_B2
Definition ecddr-einstein-dtb.hpp:1070
Structure to store norm components (for B_\alpha, D_\alpha, theta^\alpha)
Definition ecddr-einstein-dtb.hpp:39
Eigen::VectorXd D
Norms of D_alpha.
Definition ecddr-einstein-dtb.hpp:52
EinsteinNorms(Eigen::VectorXd norm_D, Eigen::VectorXd norm_theta, Eigen::VectorXd norm_B)
Constructor.
Definition ecddr-einstein-dtb.hpp:41
EinsteinNorms()
Definition ecddr-einstein-dtb.hpp:50
Eigen::VectorXd theta
Norms of theta^\alpha.
Definition ecddr-einstein-dtb.hpp:53
Eigen::VectorXd B
Norms of B_alpha.
Definition ecddr-einstein-dtb.hpp:54
Class to assemble and solve an Einstein problem.
Definition ecddr-einstein-dtb.hpp:59
std::function< Eigen::Vector3d(const double t, const Eigen::Vector3d &)> TTwoFormType
Definition ecddr-einstein-dtb.hpp:75
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> OneFormType
Definition ecddr-einstein-dtb.hpp:63
std::vector< Fct > contractParaVec(const std::vector< TFct > &TF, double t) const
Takes a vector of two parameter functions and a value and returns a function with the first parameter...
Definition ecddr-einstein-dtb.hpp:437
Einstein::CompositeUType composite_orth_U2
Definition ecddr-einstein-dtb.hpp:295
std::function< outValue(const Eigen::Vector3d &)> contractPara(const TFct &F, double t) const
Takes a two parameter function and a value and returns a function with the first parameter fixed to v...
Definition ecddr-einstein-dtb.hpp:430
std::vector< ThreeFormType > Collection3Forms
Definition ecddr-einstein-dtb.hpp:71
const Eigen::VectorXd & rhsTheta() const
Returns the rhs of theta equation.
Definition ecddr-einstein-dtb.hpp:397
const SystemMatrixType & L2_X2() const
Returns the L of the LLT decomposition of the L2 product of X2.
Definition ecddr-einstein-dtb.hpp:377
Eigen::Matrix3d expand2Form(const Eigen::Vector3d &form) const
expand a 2 form vector into a 3x3 matrix
Definition ecddr-einstein-dtb.cpp:1195
std::function< Eigen::Vector3d(const Eigen::MatrixXd &E, const Eigen::MatrixXd &B)> CompositeHType
Definition ecddr-einstein-dtb.hpp:84
Einstein::CompositeHType composite_orth_H3
Definition ecddr-einstein-dtb.hpp:221
void updateThetaRHS(const Eigen::VectorXd &starD)
Definition ecddr-einstein-dtb.cpp:1204
TTwoFormType TForcingTermType
Definition ecddr-einstein-dtb.hpp:77
std::function< Eigen::Vector3d(const Eigen::Vector3d &)> TwoFormType
Definition ecddr-einstein-dtb.hpp:64
std::vector< OneFormType > Collection1Forms
Definition ecddr-einstein-dtb.hpp:69
Einstein::CompositeEType composite_orth_E0
Definition ecddr-einstein-dtb.hpp:232
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition ecddr-einstein-dtb.hpp:362
std::vector< ZeroFormType > TCollection0Forms
Definition ecddr-einstein-dtb.hpp:79
void assembleLinearSystem(double dt, const ZeroFormType &lapse, const OneFormType &E0, const Eigen::VectorXd &starDtB)
Definition ecddr-einstein-dtb.cpp:795
SystemMatrixType & lhsTheta()
Returns the lhs of theta equation.
Definition ecddr-einstein-dtb.hpp:392
std::function< double(const Eigen::Vector3d &)> ThreeFormType
Definition ecddr-einstein-dtb.hpp:65
std::vector< ZeroFormType > Collection0Forms
Definition ecddr-einstein-dtb.hpp:68
std::function< double(const Eigen::Vector3d &)> ZeroFormType
Definition ecddr-einstein-dtb.hpp:62
Eigen::VectorXd updateLapse(double dt, Eigen::VectorXd &lapse_n, Eigen::VectorXd &starDtB)
Definition ecddr-einstein.cpp:649
Einstein::CompositeEType composite_orth_E3
Definition ecddr-einstein-dtb.hpp:261
Eigen::MatrixXd basisChange(size_t k, const Eigen::MatrixXd &forms, const Eigen::MatrixXd &basis) const
Change of basis for 2 forms.
Definition ecddr-einstein-dtb.cpp:1096
TwoFormType ForcingTermType
Definition ecddr-einstein-dtb.hpp:66
Eigen::VectorXd & rhsTheta()
Returns the rhs of theta equation.
Definition ecddr-einstein-dtb.hpp:402
std::pair< EinsteinNorms, EinsteinNorms > computeContinuousErrorsNorms(const Eigen::VectorXd &starDt, const std::vector< OneFormType > &starD, const std::vector< TwoFormType > &starTheta, const std::vector< TwoFormType > &starB) const
Definition ecddr-einstein-dtb.cpp:1421
std::vector< EinsteinNorms > computeEinsteinNorms(const std::vector< Eigen::VectorXd > &list_dofs) const
Compute the discrete L2 norms, for a family of Eigen::VectorXd.
Definition ecddr-einstein-dtb.cpp:1369
size_t dimensionSpace() const
Returns the global problem dimension.
Definition ecddr-einstein-dtb.hpp:327
Eigen::SparseMatrix< double > SystemMatrixType
Definition ecddr-einstein-dtb.hpp:60
const double & stabilizationParameter() const
Returns the stabilization parameter.
Definition ecddr-einstein-dtb.hpp:411
std::function< Eigen::Vector3d(const Eigen::MatrixXd &D)> CompositeEType
Definition ecddr-einstein-dtb.hpp:86
std::function< Eigen::Vector3d(const double t, const Eigen::Vector3d &)> TOneFormType
Definition ecddr-einstein-dtb.hpp:74
Eigen::VectorXd contractIndex(size_t index, const Eigen::MatrixXd &forms) const
Contract collection index with first form index (A_i)^{ji}.
Definition ecddr-einstein-dtb.cpp:1123
std::vector< TwoFormType > Collection2Forms
Definition ecddr-einstein-dtb.hpp:70
std::function< double(const double t, const Eigen::Vector3d &)> TThreeFormType
Definition ecddr-einstein-dtb.hpp:76
Einstein::CompositeHType composite_orth_H2
Definition ecddr-einstein-dtb.hpp:212
SystemMatrixType & L2_X1()
Returns the L of the LLT decomposition of the L2 product of X1.
Definition ecddr-einstein-dtb.hpp:372
double & stabilizationParameter()
Returns the stabilization parameter.
Definition ecddr-einstein-dtb.hpp:416
std::function< double(const double t, const Eigen::Vector3d &)> TZeroFormType
Definition ecddr-einstein-dtb.hpp:73
Eigen::Vector3d wedge11(const Eigen::Vector3d &form1, const Eigen::Vector3d &form2) const
wedge a 1-form and a 1-form to return 2-form as [A12, A13, A23]
Definition ecddr-einstein-dtb.cpp:1185
SystemMatrixType & L2_X2()
Returns the L of the LLT decomposition of the L2 product of X2.
Definition ecddr-einstein-dtb.hpp:382
const DDR_Spaces & ddrSpaces() const
Returns the ECDDR sequence.
Definition ecddr-einstein-dtb.hpp:337
Einstein::CollectionUforms composite_orth_U
Definition ecddr-einstein-dtb.hpp:320
Einstein::CompositeEType composite_orth_E2
Definition ecddr-einstein-dtb.hpp:251
Einstein::CompositeUType composite_orth_U3
Definition ecddr-einstein-dtb.hpp:308
Einstein::CompositeUType composite_orth_U0
Definition ecddr-einstein-dtb.hpp:273
void computeBCRHS(double dt, const ZeroFormType &lapse_n, const std::vector< TwoFormType > &D, const std::vector< OneFormType > &theta, const std::vector< TwoFormType > &B, const std::vector< TwoFormType > &dtD, const std::vector< OneFormType > &E, const std::vector< OneFormType > &H, const std::vector< TwoFormType > &dH)
std::vector< CompositeEType > CollectionEforms
Definition ecddr-einstein-dtb.hpp:87
const SystemMatrixType & lhsTheta() const
Returns the lhs of theta equation.
Definition ecddr-einstein-dtb.hpp:387
const SystemMatrixType & L2_X1() const
Returns the L of the LLT decomposition of the L2 product of X1.
Definition ecddr-einstein-dtb.hpp:367
std::vector< TTwoFormType > TCollection2Forms
Definition ecddr-einstein-dtb.hpp:81
Eigen::VectorXd computeConstraints(const ZeroFormType &lapse_n, const std::vector< OneFormType > &theta0, const std::vector< OneFormType > &thetan, const Eigen::VectorXd &starDB0, const Eigen::VectorXd &starDBn, LinearSolver< Einstein::SystemMatrixType > &solver) const
Compute the constraints.
Definition ecddr-einstein-dtb.cpp:1522
Einstein::CompositeHType composite_orth_H0
Definition ecddr-einstein-dtb.hpp:194
double & min_detTheta()
Definition ecddr-einstein-dtb.hpp:420
double computeResidual(const Eigen::VectorXd &starDB) const
Compute the residual.
Definition ecddr-einstein-dtb.cpp:1504
std::vector< CompositeHType > CollectionHforms
Definition ecddr-einstein-dtb.hpp:85
Einstein::CollectionHforms composite_orth_H
Definition ecddr-einstein-dtb.hpp:229
void precomputeL2()
Definition ecddr-einstein-dtb.cpp:743
std::function< Eigen::Vector3d(const Eigen::VectorXd &E0, const Eigen::VectorXd &D0, const Eigen::MatrixXd &H, const Eigen::MatrixXd &E, const Eigen::MatrixXd &D, const Eigen::MatrixXd &B)> CompositeUType
Definition ecddr-einstein-dtb.hpp:88
Einstein::CompositeEType composite_orth_E1
Definition ecddr-einstein-dtb.hpp:241
std::vector< CompositeUType > CollectionUforms
Definition ecddr-einstein-dtb.hpp:89
Einstein::CompositeUType composite_orth_U1
Definition ecddr-einstein-dtb.hpp:282
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition ecddr-einstein-dtb.hpp:352
std::vector< TOneFormType > TCollection1Forms
Definition ecddr-einstein-dtb.hpp:80
Einstein::CompositeHType composite_orth_H1
Definition ecddr-einstein-dtb.hpp:203
const Eigen::VectorXd & systemVector() const
Returns the linear system right-hand side vector.
Definition ecddr-einstein-dtb.hpp:357
std::vector< TThreeFormType > TCollection3Forms
Definition ecddr-einstein-dtb.hpp:82
Einstein::CollectionEforms composite_orth_E
Definition ecddr-einstein-dtb.hpp:270
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition ecddr-einstein-dtb.hpp:347
Struct to store the systems and vector.
Definition parallel_for.hpp:18