To specify the sparsity pattern directly if it is already known.
Note
If specifying the linear pattern, all three optional arguments must be present.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(numdiff_type), | intent(inout) | :: | me | |||
integer, | intent(in), | dimension(:) | :: | irow |
sparsity pattern nonzero elements row indices |
|
integer, | intent(in), | dimension(:) | :: | icol |
sparsity pattern nonzero elements column indices |
|
integer, | intent(in), | optional, | dimension(:) | :: | linear_irow |
linear sparsity pattern nonzero elements row indices |
integer, | intent(in), | optional, | dimension(:) | :: | linear_icol |
linear sparsity pattern nonzero elements column indices |
real(kind=wp), | intent(in), | optional, | dimension(:) | :: | linear_vals |
linear sparsity values (constant elements of the Jacobian) |
integer, | intent(in), | optional | :: | maxgrp |
DSM sparsity partition
[only used if |
|
integer, | intent(in), | optional, | dimension(:) | :: | ngrp |
DSM sparsity partition (size |
subroutine set_sparsity_pattern(me,irow,icol,linear_irow,linear_icol,linear_vals,maxgrp,ngrp) implicit none class(numdiff_type),intent(inout) :: me integer,dimension(:),intent(in) :: irow !! sparsity pattern nonzero elements row indices integer,dimension(:),intent(in) :: icol !! sparsity pattern nonzero elements column indices integer,dimension(:),intent(in),optional :: linear_irow !! linear sparsity pattern nonzero elements row indices integer,dimension(:),intent(in),optional :: linear_icol !! linear sparsity pattern nonzero elements column indices real(wp),dimension(:),intent(in),optional :: linear_vals !! linear sparsity values (constant elements of the Jacobian) integer,intent(in),optional :: maxgrp !! DSM sparsity partition !! [only used if `me%partition_sparsity_pattern=True`] integer,dimension(:),intent(in),optional :: ngrp !! DSM sparsity partition (size `n`) !! [only used if `me%partition_sparsity_pattern=True`] integer :: info !! status output form [[dsm]] call me%destroy_sparsity_pattern() if (me%exception_raised) return ! check for exceptions if (size(irow)/=size(icol) .or. any(irow>me%m) .or. any(icol>me%n)) then call me%raise_exception(15,'set_sparsity_pattern',& 'invalid inputs') return else me%sparsity%sparsity_computed = .true. me%sparsity%num_nonzero_elements = size(irow) me%sparsity%irow = irow me%sparsity%icol = icol call me%sparsity%compute_indices() if (me%partition_sparsity_pattern) then if (present(maxgrp) .and. present(ngrp)) then ! use the user-input partition: if (maxgrp>0 .and. all(ngrp>=1 .and. ngrp<=maxgrp) .and. size(ngrp)==me%n) then me%sparsity%maxgrp = maxgrp me%sparsity%ngrp = ngrp else call me%raise_exception(28,'set_sparsity_pattern',& 'invalid sparsity partition inputs.') return end if else call me%sparsity%dsm_wrapper(me%n,me%m,info) if (info/=1) then call me%raise_exception(16,'set_sparsity_pattern',& 'error partitioning sparsity pattern.') return end if end if end if end if ! linear pattern: if (present(linear_irow) .and. present(linear_icol) .and. present(linear_vals)) then if (size(linear_irow)/=size(linear_icol) .or. & size(linear_vals)/=size(linear_icol) .or. & any(linear_irow>me%m) .or. & any(linear_icol>me%n)) then call me%raise_exception(17,'set_sparsity_pattern',& 'invalid linear sparsity pattern') return else me%sparsity%linear_irow = linear_irow me%sparsity%linear_icol = linear_icol me%sparsity%linear_vals = linear_vals me%sparsity%linear_sparsity_computed = .true. me%sparsity%num_nonzero_linear_elements = size(linear_irow) end if end if end subroutine set_sparsity_pattern