00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 char tslice_check_einstein_C[] = "$Header: /cvsroot/Lorene/C++/Source/Time_slice/tslice_check_einstein.C,v 1.8 2010/10/20 07:58:09 j_novak Exp $" ;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #include <stdlib.h>
00066 #include <assert.h>
00067
00068
00069 #include "time_slice.h"
00070 #include "unites.h"
00071
00072 Tbl Time_slice::check_hamiltonian_constraint(const Scalar* energy_density,
00073 ostream& ost, bool verb) const {
00074 using namespace Unites ;
00075
00076 bool vacuum = ( energy_density == 0x0 ) ;
00077
00078 Scalar field = trk() * trk() - contract( k_uu(), 0, 1, k_dd(), 0, 1 ) ;
00079
00080 field.dec_dzpuis() ;
00081
00082 field += gam().ricci_scal() ;
00083
00084 const Scalar* matter ;
00085 if (vacuum)
00086 matter = new Scalar (0*field) ;
00087 else
00088 matter = energy_density ;
00089
00090 if (verb) ost << endl ;
00091 const char* comment = 0x0 ;
00092 if (verb) comment = "Check of the Hamiltonian constraint" ;
00093 Tbl resu = maxabs(field - (4*qpig) * (*matter), comment, ost,verb ) ;
00094 if (verb) ost << endl ;
00095
00096 if (vacuum) delete matter ;
00097
00098 return resu ;
00099
00100 }
00101
00102 Tbl Time_slice::check_momentum_constraint(const Vector* momentum_density,
00103 ostream& ost, bool verb) const {
00104 using namespace Unites ;
00105
00106 bool vacuum = ( momentum_density == 0x0 ) ;
00107
00108 Vector field = k_uu().divergence(gam()) - trk().derive_con(gam()) ;
00109
00110
00111 const Vector* matter ;
00112 if (vacuum)
00113 matter = new Vector (0*field) ;
00114 else {
00115 assert (momentum_density->get_index_type(0) == CON) ;
00116 matter = momentum_density ;
00117 }
00118
00119 if (verb) ost << endl ;
00120 const char* comment = 0x0 ;
00121 if (verb) comment = "Check of the momentum constraint" ;
00122 Tbl resu = maxabs(field - (2*qpig) * (*matter), comment, ost, verb ) ;
00123
00124 if (verb) ost << endl ;
00125
00126 if (vacuum) delete matter ;
00127
00128 return resu ;
00129
00130 }
00131
00132 Tbl Time_slice::check_dynamical_equations(const Sym_tensor* strain_tensor,
00133 const Scalar* energy_density,
00134 ostream& ost, bool verb) const {
00135
00136 using namespace Unites ;
00137
00138 bool vacuum = ( ( strain_tensor == 0x0 ) && ( energy_density == 0x0 ) ) ;
00139
00140 Sym_tensor dyn_lhs = (k_dd_evol.time_derive(jtime, scheme_order)).up_down(gam()) ;
00141 int nz = dyn_lhs.get_mp().get_mg()->get_nzone() ;
00142 dyn_lhs.annule_domain(nz-1) ;
00143 dyn_lhs = dyn_lhs - k_dd().derive_lie(beta()).up_down(gam()) ;
00144 dyn_lhs.annule_domain(nz-1) ;
00145
00146 const Sym_tensor* matter ;
00147 if (vacuum)
00148 matter = new Sym_tensor(0 * dyn_lhs) ;
00149 else {
00150 const Scalar* ener = 0x0 ;
00151 const Sym_tensor* sij = 0x0 ;
00152 bool new_e = false ;
00153 bool new_s = false ;
00154 if (energy_density == 0x0) {
00155 ener = new Scalar ( 0 * nn() ) ;
00156 new_e = true ;
00157 }
00158 else {
00159 ener = energy_density ;
00160 if (strain_tensor == 0x0) {
00161 sij = new Sym_tensor(0 * dyn_lhs) ;
00162 new_s = true ;
00163 }
00164 else
00165 sij = strain_tensor ;
00166 }
00167 matter = new Sym_tensor( (sij->trace(gam()) - *ener)*gam().con()
00168 - 2*(*sij) ) ;
00169 if (new_e) delete ener ;
00170 if (new_s) delete sij ;
00171 }
00172
00173 Sym_tensor dyn_rhs = nn()*( (gam().ricci().up_down(gam()) + trk()*k_uu()
00174 + qpig * (*matter))) ;
00175 dyn_rhs.annule_domain(nz-1) ;
00176 dyn_rhs = dyn_rhs - 2*nn()*contract(k_uu(), 1, k_dd().up(0, gam()), 1) ;
00177 dyn_rhs.annule_domain(nz-1) ;
00178 dyn_rhs = dyn_rhs - nn().derive_con(gam()).derive_con(gam()) ;
00179 dyn_rhs.annule_domain(nz-1) ;
00180
00181 if (verb) ost << endl ;
00182 const char* comment = 0x0 ;
00183 if (verb) comment = "Check of the dynamical equations" ;
00184 Tbl resu_tmp = maxabs(dyn_lhs - dyn_rhs, comment, ost, verb) ;
00185
00186 if (verb) ost << endl ;
00187
00188 if (vacuum) delete matter ;
00189
00190 Tbl resu(4, 4, resu_tmp.get_dim(0)) ;
00191 resu.annule_hard() ;
00192
00193
00194 for (int i=1; i<=3; i++) {
00195 for (int j=1; j<=i; j++) {
00196 Itbl idx(2) ;
00197 idx.set(0) = i ;
00198 idx.set(1) = j ;
00199 int pos = dyn_lhs.position(idx) ;
00200 assert (dyn_rhs.position(idx) == pos) ;
00201
00202 for (int lz=0; lz<resu_tmp.get_dim(0); lz++)
00203 resu.set(i,j,lz) = resu_tmp(pos, lz) ;
00204 }
00205 }
00206
00207 return resu ;
00208
00209 }