Commit db6500dcfb6c82b1630b7a6d35067cd1ee90cf78

Authored by William Daniau
1 parent b5f099f3cf
Exists in multi

First draft for a multi resolution

Showing 1 changed file with 83 additions and 0 deletions Side-by-side Diff

fvn_sparse/fvn_sparse.f90
... ... @@ -345,6 +345,89 @@
345 345 end subroutine
346 346  
347 347  
  348 +subroutine fvn_di_sparse_solve_multi(n,nz,T,Ti,Tj,m,B,x,status,det)
  349 +implicit none
  350 +integer(kind=sp_kind), intent(in) :: n,nz,m
  351 +real(kind=dp_kind),dimension(nz),intent(in) :: T
  352 +integer(kind=sp_kind),dimension(nz),intent(in) :: Ti,Tj
  353 +real(kind=dp_kind),dimension(n,m),intent(in) :: B
  354 +real(kind=dp_kind),dimension(n,m),intent(out) :: x
  355 +integer(kind=sp_kind), intent(out) :: status
  356 +real(kind=dp_kind), dimension(2), optional, intent(out) :: det
  357 +
  358 +real(kind=dp_kind),dimension(:),allocatable :: A
  359 +integer(kind=sp_kind),dimension(:),allocatable :: Ap,Ai
  360 +!integer(kind=dp_kind) :: symbolic,numeric
  361 +integer(kind=sp_kind),dimension(2) :: symbolic,numeric
  362 +! As symbolic and numeric are used to store a C pointer, it is necessary to
  363 +! still use an integer(kind=dp_kind) for 64bits machines
  364 +! An other possibility : integer(kind=sp_kind),dimension(2) :: symbolic,numeric
  365 +real(kind=dp_kind),dimension(90) :: info
  366 +real(kind=dp_kind),dimension(20) :: control
  367 +integer(kind=sp_kind) :: sys
  368 +integer(kind=sp_kind) :: i
  369 +
  370 +status=0
  371 +allocate(A(nz))
  372 +allocate(Ap(n+1),Ai(nz))
  373 +
  374 +! perform the triplet to compressed column form -> Ap,Ai,Ax,Az
  375 +call umfpack_di_triplet_to_col(n,n,nz,Ti,Tj,T,Ap,Ai,A,status)
  376 +! if status is not zero a problem has occured
  377 +if (status /= 0) then
  378 + write(*,*) "Problem during umfpack_di_triplet_to_col : ",trim(umfpack_return_code(status))
  379 +endif
  380 +
  381 +! Define defaults control values
  382 +call umfpack_di_defaults(control)
  383 +
  384 +! Symbolic analysis
  385 +call umfpack_di_symbolic(n,n,Ap,Ai,A,symbolic, control, info)
  386 +! info(1) should be zero
  387 +if (info(1) /= 0) then
  388 + write(*,*) "Problem during symbolic analysis : ",trim(umfpack_return_code(int(info(1),kind=sp_kind)))
  389 + status=info(1)
  390 +endif
  391 +
  392 +! Numerical factorization
  393 +call umfpack_di_numeric (Ap, Ai, A, symbolic, numeric, control, info)
  394 +! info(1) should be zero
  395 +if (info(1) /= 0) then
  396 + write(*,*) "Problem during numerical factorization : ",trim(umfpack_return_code(int(info(1),kind=sp_kind)))
  397 + status=info(1)
  398 +endif
  399 +
  400 +! free the C symbolic pointer
  401 +call umfpack_di_free_symbolic (symbolic)
  402 +
  403 +! if parameter det is present, the determinant of the matrix is calculated
  404 +if (present(det) ) then
  405 + call umfpack_di_get_determinant(det(1),det(2),numeric,info,status)
  406 + ! info(1) should be zero
  407 + if (info(1) /= 0) then
  408 + if ( (info(1) < 1) .or. (info(1) >3) ) then ! not a warning
  409 + write(*,*) "Problem during sparse determinant : ",trim(umfpack_return_code(int(info(1),kind=sp_kind)))
  410 + endif
  411 + status=info(1)
  412 + endif
  413 +endif
  414 +
  415 +sys=0
  416 +! sys may be used to define type of solving -> see umfpack.h
  417 +do i=1,m
  418 + ! Solving
  419 + call umfpack_di_solve (sys, Ap, Ai, A, x(:,i), B(:,i), numeric, control, info)
  420 + ! info(1) should be zero
  421 + if (info(1) /= 0) then
  422 + write(*,*) "Problem during solving : ",trim(umfpack_return_code(int(info(1),kind=sp_kind)))
  423 + status=info(1)
  424 + endif
  425 +end do
  426 +! free the C numeric pointer
  427 +call umfpack_di_free_numeric (numeric)
  428 +
  429 +deallocate(A)
  430 +end subroutine
348 431  
349 432  
350 433