QR_MUMPS
 All Classes Files Functions Variables Enumerations Enumerator Pages
qrm_solve_sing_front.F90
Go to the documentation of this file.
1 !! ##############################################################################################
2 !!
3 !! Copyright 2012 CNRS, INPT
4 !!
5 !! This file is part of qr_mumps.
6 !!
7 !! qr_mumps is free software: you can redistribute it and/or modify
8 !! it under the terms of the GNU Lesser General Public License as
9 !! published by the Free Software Foundation, either version 3 of
10 !! the License, or (at your option) any later version.
11 !!
12 !! qr_mumps is distributed in the hope that it will be useful,
13 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
14 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 !! GNU Lesser General Public License for more details.
16 !!
17 !! You can find a copy of the GNU Lesser General Public License
18 !! in the qr_mumps/doc directory.
19 !!
20 !! ##############################################################################################
21 
22 
23 !! ##############################################################################################
33 
34 
35 #include "qrm_common.h"
36 
49 subroutine _qrm_solve_sing_front(qrm_mat, b, x, trans)
50 
51  use _qrm_spmat_mod
52  use qrm_string_mod
53  use _qrm_fdata_mod
54  implicit none
55 
56  type(_qrm_spmat_type), target :: qrm_mat
57  _qrm_data, intent(inout) :: b(:,:)
58  _qrm_data, intent(inout) :: x(:,:)
59  character :: trans
60 
61  type(_qrm_front_type), pointer :: front
62  integer :: i, j, row, col
63  _qrm_data :: d
64 
65  ! the front with the singletons is always the first one
66  front => qrm_mat%fdata%front_list(1)
67 
68  ! do the computations.
69  !
70  ! THIS ROUTINE ASSUMES THAT THE DIAGONAL ELEMENTS IN FRONT%AVAL AND
71  ! FRONT%AJCN ALWAYS COME BEFORE THE OTHERS ALONG THEIR ROW. THIS IS
72  ! ENFORCED INSIDE QRM_FACTORIZATION_INIT
73  !
74  if(qrm_str_tolower(trans) .eq. 'n') then
75  do i=front%anrows, 1, -1
76  row =qrm_mat%adata%rperm(i)
77  do j=front%aiptr(i+1)-1, front%aiptr(i)+1,-1
78  col = front%ajcn(j)
79  b(row,:) = b(row,:) - front%aval(j)*x(col,:)
80  end do
81  x(qrm_mat%adata%cperm(i),:) = b(row,:)/front%aval(front%aiptr(i))
82  end do
83 
84  else if(qrm_str_tolower(trans) .eq. 't') then
85 
86  do j=1, front%anrows
87  col = qrm_mat%adata%rperm(j)
88  x(col,:) = b(qrm_mat%adata%cperm(j),:)/_conjg(front%aval(front%aiptr(j)))
89  do i=front%aiptr(j)+1, front%aiptr(j+1)-1
90  row = front%ajcn(i)
91  b(row,:) = b(row,:)-_conjg(front%aval(i))*x(col,:)
92  end do
93  end do
94  else
95 
96  end if
97 
98  return
99 
100 end subroutine _qrm_solve_sing_front
101 
This module contains the definition of all the data related to the factorization phase.
subroutine _qrm_solve_sing_front(qrm_mat, b, x, trans)
This function handles the front containing the singletons during the solve for R or R'...
This type defines the data structure used to store a matrix.
This module contains the definition of the basic sparse matrix type and of the associated methods...
This module contains various string handling routines.
int i
Definition: secs.c:40
This type defines a data structure containing all the data related to a front.