Go to the documentation of this file.00001 #ifndef OPENTISSUE_CORE_MATH_BIG_BIG_SHUR_SYSTEM_H
00002 #define OPENTISSUE_CORE_MATH_BIG_BIG_SHUR_SYSTEM_H
00003
00004
00005
00006
00007
00008
00009
00010 #include <OpenTissue/configuration.h>
00011
00012
00013 #include <OpenTissue/core/math/big/big_types.h>
00014 #include <OpenTissue/core/math/big/big_prod.h>
00015 #include <OpenTissue/core/math/big/big_prod_sub.h>
00016
00017 #include <OpenTissue/core/math/math_value_traits.h>
00018
00019 namespace OpenTissue
00020 {
00021 namespace math
00022 {
00023 namespace big
00024 {
00025
00068 template<typename T, typename solver_function_type>
00069 inline void shur_system(
00070 ublas::compressed_matrix<T> & A_aa
00071 , ublas::compressed_matrix<T> const & A_ab
00072 , ublas::compressed_matrix<T> const & C
00073 , ublas::compressed_matrix<T> const & invD
00074 , ublas::vector<T> & rhs_a
00075 , ublas::vector<T> & rhs_b
00076 , ublas::vector<T> & dx_a
00077 , ublas::vector<T> & dx_b
00078 , solver_function_type const & solve
00079 )
00080 {
00081 typedef ublas::compressed_matrix<T> matrix_type;
00082 typedef ublas::vector<T> vector_type;
00083 typedef typename vector_type::size_type size_type;
00084 typedef T real_type;
00085 typedef OpenTissue::math::ValueTraits<T> value_traits;
00086
00087 size_type A = rhs_a.size();
00088 size_type B = rhs_b.size();
00089
00090 dx_a.resize(A);
00091 dx_b.resize(B);
00092
00093 if(A>0)
00094 {
00095 if(B>0)
00096 {
00097
00098
00099
00100
00101
00102 OpenTissue::math::big::prod(invD, rhs_b, dx_b);
00103 OpenTissue::math::big::prod(A_ab, dx_b, dx_a);
00104 rhs_a -= dx_a;
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 matrix_type M1;
00121 matrix_type M2;
00122 M1.resize( B, A, false );
00123 M2.resize( A, A, false );
00124
00125 ublas::noalias( M1 ) = ublas::sparse_prod<matrix_type>( invD, C);
00126 ublas::noalias( M2 ) = ublas::sparse_prod<matrix_type>( A_ab, M1);
00127 ublas::noalias( A_aa ) -= M2;
00128 }
00129
00130
00131
00132
00133
00134 solve(A_aa, dx_a, rhs_a);
00135
00136 if(B>0)
00137 {
00138
00139
00140
00141
00142 OpenTissue::math::big::prod_sub( C, dx_a, rhs_b);
00143 }
00144 }
00145 if(B>0)
00146 {
00147 OpenTissue::math::big::prod(invD, rhs_b, dx_b);
00148 }
00149
00150 }
00151
00152 }
00153 }
00154 }
00155
00156
00157 #endif