void DistributedVector<T>::conjugate() { for (numeric_index_type i=0; i<local_size(); i++) { // Replace values by complex conjugate _values[i] = libmesh_conj(_values[i]); } }
void LaspackVector<T>::conjugate() { const numeric_index_type n = this->size(); for (numeric_index_type i=0; i<n; i++) { T v = (*this)(i); this->set(i, libmesh_conj(v) ); } }
Real RBEvaluation::eval_output_dual_norm(unsigned int n, const RBParameters& mu) { Number output_bound_sq = 0.; unsigned int q=0; for(unsigned int q_l1=0; q_l1<rb_theta_expansion->get_n_output_terms(n); q_l1++) { for(unsigned int q_l2=q_l1; q_l2<rb_theta_expansion->get_n_output_terms(n); q_l2++) { Real delta = (q_l1==q_l2) ? 1. : 2.; output_bound_sq += delta * libmesh_real( libmesh_conj(rb_theta_expansion->eval_output_theta(n,q_l1,mu))* rb_theta_expansion->eval_output_theta(n,q_l2,mu) * output_dual_innerprods[n][q] ); q++; } } return libmesh_real(std::sqrt( output_bound_sq )); }
Real RBEvaluation::compute_residual_dual_norm(const unsigned int N) { START_LOG("compute_residual_dual_norm()", "RBEvaluation"); const RBParameters& mu = get_parameters(); // Use the stored representor inner product values // to evaluate the residual norm Number residual_norm_sq = 0.; unsigned int q=0; for(unsigned int q_f1=0; q_f1<rb_theta_expansion->get_n_F_terms(); q_f1++) { for(unsigned int q_f2=q_f1; q_f2<rb_theta_expansion->get_n_F_terms(); q_f2++) { Real delta = (q_f1==q_f2) ? 1. : 2.; residual_norm_sq += delta * libmesh_real( rb_theta_expansion->eval_F_theta(q_f1, mu) * libmesh_conj(rb_theta_expansion->eval_F_theta(q_f2, mu)) * Fq_representor_innerprods[q] ); q++; } } for(unsigned int q_f=0; q_f<rb_theta_expansion->get_n_F_terms(); q_f++) { for(unsigned int q_a=0; q_a<rb_theta_expansion->get_n_A_terms(); q_a++) { for(unsigned int i=0; i<N; i++) { Real delta = 2.; residual_norm_sq += delta * libmesh_real( rb_theta_expansion->eval_F_theta(q_f, mu) * libmesh_conj(rb_theta_expansion->eval_A_theta(q_a, mu)) * libmesh_conj(RB_solution(i)) * Fq_Aq_representor_innerprods[q_f][q_a][i] ); } } } q=0; for(unsigned int q_a1=0; q_a1<rb_theta_expansion->get_n_A_terms(); q_a1++) { for(unsigned int q_a2=q_a1; q_a2<rb_theta_expansion->get_n_A_terms(); q_a2++) { Real delta = (q_a1==q_a2) ? 1. : 2.; for(unsigned int i=0; i<N; i++) { for(unsigned int j=0; j<N; j++) { residual_norm_sq += delta * libmesh_real( libmesh_conj(rb_theta_expansion->eval_A_theta(q_a1, mu)) * rb_theta_expansion->eval_A_theta(q_a2, mu) * libmesh_conj(RB_solution(i)) * RB_solution(j) * Aq_Aq_representor_innerprods[q][i][j] ); } } q++; } } if(libmesh_real(residual_norm_sq) < 0.) { // libMesh::out << "Warning: Square of residual norm is negative " // << "in RBSystem::compute_residual_dual_norm()" << std::endl; // Sometimes this is negative due to rounding error, // but when this occurs the error is on the order of 1.e-10, // so shouldn't affect error bound much... residual_norm_sq = std::abs(residual_norm_sq); } STOP_LOG("compute_residual_dual_norm()", "RBEvaluation"); return std::sqrt( libmesh_real(residual_norm_sq) ); }