50 REAL(KIND=8),
PARAMETER ::
real_eps = 2.2204460492503131e-16
71 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
72 TYPE(
coolist),
DIMENSION(ndim),
INTENT(OUT) :: dst
73 INTEGER :: i,j,AllocStat
76 IF (dst(i)%nelems/=0) stop
"*** copy_tensor : Destination coolist not empty ! ***" 77 ALLOCATE(dst(i)%elems(src(i)%nelems),
stat=allocstat)
78 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 80 dst(i)%elems(j)%j=src(i)%elems(j)%j
81 dst(i)%elems(j)%k=src(i)%elems(j)%k
82 dst(i)%elems(j)%v=src(i)%elems(j)%v
84 dst(i)%nelems=src(i)%nelems
92 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
93 TYPE(
coolist),
DIMENSION(ndim),
INTENT(INOUT) :: dst
95 INTEGER :: i,j,n,AllocStat
98 IF (src(i)%nelems/=0)
THEN 99 IF (dst(i)%nelems==0)
THEN 100 IF (
ALLOCATED(dst(i)%elems))
THEN 101 DEALLOCATE(dst(i)%elems,
stat=allocstat)
102 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 104 ALLOCATE(dst(i)%elems(src(i)%nelems),
stat=allocstat)
105 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 109 ALLOCATE(celems(n),
stat=allocstat)
111 celems(j)%j=dst(i)%elems(j)%j
112 celems(j)%k=dst(i)%elems(j)%k
113 celems(j)%v=dst(i)%elems(j)%v
115 DEALLOCATE(dst(i)%elems,
stat=allocstat)
116 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 117 ALLOCATE(dst(i)%elems(src(i)%nelems+n),
stat=allocstat)
118 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 120 dst(i)%elems(j)%j=celems(j)%j
121 dst(i)%elems(j)%k=celems(j)%k
122 dst(i)%elems(j)%v=celems(j)%v
124 DEALLOCATE(celems,
stat=allocstat)
125 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 128 dst(i)%elems(n+j)%j=src(i)%elems(j)%j
129 dst(i)%elems(n+j)%k=src(i)%elems(j)%k
130 dst(i)%elems(n+j)%v=src(i)%elems(j)%v
132 dst(i)%nelems=src(i)%nelems+n
144 INTEGER,
INTENT(IN) :: i
145 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(IN) :: src
146 TYPE(
coolist),
DIMENSION(ndim),
INTENT(INOUT) :: dst
148 INTEGER :: j,k,r,n,nsrc,AllocStat
153 IF (abs(src(j,k))>
real_eps) nsrc=nsrc+1
157 IF (dst(i)%nelems==0)
THEN 158 IF (
ALLOCATED(dst(i)%elems))
THEN 159 DEALLOCATE(dst(i)%elems,
stat=allocstat)
160 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 162 ALLOCATE(dst(i)%elems(nsrc),
stat=allocstat)
163 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 167 ALLOCATE(celems(n),
stat=allocstat)
169 celems(j)%j=dst(i)%elems(j)%j
170 celems(j)%k=dst(i)%elems(j)%k
171 celems(j)%v=dst(i)%elems(j)%v
173 DEALLOCATE(dst(i)%elems,
stat=allocstat)
174 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 175 ALLOCATE(dst(i)%elems(nsrc+n),
stat=allocstat)
176 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 178 dst(i)%elems(j)%j=celems(j)%j
179 dst(i)%elems(j)%k=celems(j)%k
180 dst(i)%elems(j)%v=celems(j)%v
182 DEALLOCATE(celems,
stat=allocstat)
183 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 190 dst(i)%elems(n+r)%j=j
191 dst(i)%elems(n+r)%k=k
192 dst(i)%elems(n+r)%v=src(j,k)
206 INTEGER,
INTENT(IN) :: i,j
207 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(IN) :: src
208 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(INOUT) :: dst
210 INTEGER :: k,l,r,n,nsrc,AllocStat
215 IF (abs(src(k,l))>
real_eps) nsrc=nsrc+1
219 IF (dst(i)%nelems==0)
THEN 220 IF (
ALLOCATED(dst(i)%elems))
THEN 221 DEALLOCATE(dst(i)%elems,
stat=allocstat)
222 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 224 ALLOCATE(dst(i)%elems(nsrc),
stat=allocstat)
225 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 229 ALLOCATE(celems(n),
stat=allocstat)
231 celems(k)%j=dst(i)%elems(k)%j
232 celems(k)%k=dst(i)%elems(k)%k
233 celems(k)%l=dst(i)%elems(k)%l
234 celems(k)%v=dst(i)%elems(k)%v
236 DEALLOCATE(dst(i)%elems,
stat=allocstat)
237 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 238 ALLOCATE(dst(i)%elems(nsrc+n),
stat=allocstat)
239 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 241 dst(i)%elems(k)%j=celems(k)%j
242 dst(i)%elems(k)%k=celems(k)%k
243 dst(i)%elems(k)%l=celems(k)%l
244 dst(i)%elems(k)%v=celems(k)%v
246 DEALLOCATE(celems,
stat=allocstat)
247 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 254 dst(i)%elems(n+r)%j=j
255 dst(i)%elems(n+r)%k=k
256 dst(i)%elems(n+r)%l=l
257 dst(i)%elems(n+r)%v=src(k,l)
271 INTEGER,
INTENT(IN) :: j,k
272 REAL(KIND=8),
DIMENSION(ndim),
INTENT(IN) :: src
273 TYPE(
coolist),
DIMENSION(ndim),
INTENT(INOUT) :: dst
275 INTEGER :: i,l,r,n,nsrc,AllocStat
280 IF (dst(i)%nelems==0)
THEN 281 IF (
ALLOCATED(dst(i)%elems))
THEN 282 DEALLOCATE(dst(i)%elems,
stat=allocstat)
283 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 285 ALLOCATE(dst(i)%elems(nsrc),
stat=allocstat)
286 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 290 ALLOCATE(celems(n),
stat=allocstat)
292 celems(l)%j=dst(i)%elems(l)%j
293 celems(l)%k=dst(i)%elems(l)%k
294 celems(l)%v=dst(i)%elems(l)%v
296 DEALLOCATE(dst(i)%elems,
stat=allocstat)
297 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 298 ALLOCATE(dst(i)%elems(nsrc+n),
stat=allocstat)
299 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 301 dst(i)%elems(l)%j=celems(l)%j
302 dst(i)%elems(l)%k=celems(l)%k
303 dst(i)%elems(l)%v=celems(l)%v
305 DEALLOCATE(celems,
stat=allocstat)
306 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 311 dst(i)%elems(n+r)%j=j
312 dst(i)%elems(n+r)%k=k
313 dst(i)%elems(n+r)%v=src(i)
326 INTEGER,
INTENT(IN) :: i,k,l
327 REAL(KIND=8),
DIMENSION(ndim),
INTENT(IN) :: src
328 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(INOUT) :: dst
330 INTEGER :: j,ne,r,n,nsrc,AllocStat
334 IF (abs(src(j))>
real_eps) nsrc=nsrc+1
337 IF (dst(i)%nelems==0)
THEN 338 IF (
ALLOCATED(dst(i)%elems))
THEN 339 DEALLOCATE(dst(i)%elems,
stat=allocstat)
340 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 342 ALLOCATE(dst(i)%elems(nsrc),
stat=allocstat)
343 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 347 ALLOCATE(celems(n),
stat=allocstat)
349 celems(ne)%j=dst(i)%elems(ne)%j
350 celems(ne)%k=dst(i)%elems(ne)%k
351 celems(ne)%l=dst(i)%elems(ne)%l
352 celems(ne)%v=dst(i)%elems(ne)%v
354 DEALLOCATE(dst(i)%elems,
stat=allocstat)
355 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 356 ALLOCATE(dst(i)%elems(nsrc+n),
stat=allocstat)
357 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 359 dst(i)%elems(ne)%j=celems(ne)%j
360 dst(i)%elems(ne)%k=celems(ne)%k
361 dst(i)%elems(ne)%l=celems(ne)%l
362 dst(i)%elems(ne)%v=celems(ne)%v
364 DEALLOCATE(celems,
stat=allocstat)
365 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 371 dst(i)%elems(n+r)%j=j
372 dst(i)%elems(n+r)%k=k
373 dst(i)%elems(n+r)%l=l
374 dst(i)%elems(n+r)%v=src(j)
376 dst(i)%elems(n+r)%j=k
377 dst(i)%elems(n+r)%k=l
378 dst(i)%elems(n+r)%l=j
379 dst(i)%elems(n+r)%v=src(j)
381 dst(i)%elems(n+r)%j=l
382 dst(i)%elems(n+r)%k=j
383 dst(i)%elems(n+r)%l=k
384 dst(i)%elems(n+r)%v=src(j)
395 INTEGER,
INTENT(IN) :: i,k,l
396 REAL(KIND=8),
DIMENSION(ndim),
INTENT(IN) :: src
397 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(INOUT) :: dst
399 INTEGER :: j,ne,r,n,nsrc,AllocStat
403 IF (abs(src(j))>
real_eps) nsrc=nsrc+1
406 IF (dst(i)%nelems==0)
THEN 407 IF (
ALLOCATED(dst(i)%elems))
THEN 408 DEALLOCATE(dst(i)%elems,
stat=allocstat)
409 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 411 ALLOCATE(dst(i)%elems(nsrc),
stat=allocstat)
412 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 416 ALLOCATE(celems(n),
stat=allocstat)
418 celems(ne)%j=dst(i)%elems(ne)%j
419 celems(ne)%k=dst(i)%elems(ne)%k
420 celems(ne)%l=dst(i)%elems(ne)%l
421 celems(ne)%v=dst(i)%elems(ne)%v
423 DEALLOCATE(dst(i)%elems,
stat=allocstat)
424 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 425 ALLOCATE(dst(i)%elems(nsrc+n),
stat=allocstat)
426 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 428 dst(i)%elems(ne)%j=celems(ne)%j
429 dst(i)%elems(ne)%k=celems(ne)%k
430 dst(i)%elems(ne)%l=celems(ne)%l
431 dst(i)%elems(ne)%v=celems(ne)%v
433 DEALLOCATE(celems,
stat=allocstat)
434 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 440 dst(i)%elems(n+r)%j=j
441 dst(i)%elems(n+r)%k=k
442 dst(i)%elems(n+r)%l=l
443 dst(i)%elems(n+r)%v=src(j)
454 INTEGER,
INTENT(IN) :: i,j,k
455 REAL(KIND=8),
DIMENSION(ndim),
INTENT(IN) :: src
456 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(INOUT) :: dst
458 INTEGER :: l,ne,r,n,nsrc,AllocStat
462 IF (abs(src(l))>
real_eps) nsrc=nsrc+1
465 IF (dst(i)%nelems==0)
THEN 466 IF (
ALLOCATED(dst(i)%elems))
THEN 467 DEALLOCATE(dst(i)%elems,
stat=allocstat)
468 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 470 ALLOCATE(dst(i)%elems(nsrc),
stat=allocstat)
471 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 475 ALLOCATE(celems(n),
stat=allocstat)
477 celems(ne)%j=dst(i)%elems(ne)%j
478 celems(ne)%k=dst(i)%elems(ne)%k
479 celems(ne)%l=dst(i)%elems(ne)%l
480 celems(ne)%v=dst(i)%elems(ne)%v
482 DEALLOCATE(dst(i)%elems,
stat=allocstat)
483 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 484 ALLOCATE(dst(i)%elems(nsrc+n),
stat=allocstat)
485 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 487 dst(i)%elems(ne)%j=celems(ne)%j
488 dst(i)%elems(ne)%k=celems(ne)%k
489 dst(i)%elems(ne)%l=celems(ne)%l
490 dst(i)%elems(ne)%v=celems(ne)%v
492 DEALLOCATE(celems,
stat=allocstat)
493 IF (allocstat /= 0) stop
"*** Deallocation problem ! ***" 499 dst(i)%elems(n+r)%j=j
500 dst(i)%elems(n+r)%k=k
501 dst(i)%elems(n+r)%l=l
502 dst(i)%elems(n+r)%v=src(l)
515 REAL(KIND=8),
DIMENSION(0:ndim,0:ndim),
INTENT(IN) :: src
516 TYPE(
coolist),
DIMENSION(ndim),
INTENT(OUT) :: dst
517 INTEGER :: i,j,n,AllocStat
524 IF (dst(i)%nelems/=0) stop
"*** mat_to_coo : Destination coolist not empty ! ***" 525 ALLOCATE(dst(i)%elems(n),
stat=allocstat)
526 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 533 dst(i)%elems(n)%v=src(i,j)
547 REAL(KIND=8),
DIMENSION(ndim,0:ndim,0:ndim),
INTENT(IN) :: src
548 TYPE(
coolist),
DIMENSION(ndim),
INTENT(OUT) :: dst
549 INTEGER :: i,j,k,n,AllocStat
559 IF (dst(i)%nelems/=0) stop
"*** tensor_to_coo : Destination coolist not empty ! ***" 560 ALLOCATE(dst(i)%elems(n),
stat=allocstat)
561 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 569 dst(i)%elems(n)%v=src(i,j,k)
583 REAL(KIND=8),
DIMENSION(ndim,0:ndim,0:ndim,0:ndim),
INTENT(IN) :: src
584 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(OUT) :: dst
585 INTEGER :: i,j,k,l,n,AllocStat
592 IF (abs(src(i,j,k,l))>
real_eps) n=n+1
597 IF (dst(i)%nelems/=0) stop
"*** tensor_to_coo : Destination coolist not empty ! ***" 598 ALLOCATE(dst(i)%elems(n),
stat=allocstat)
599 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 604 IF (abs(src(i,j,k,l))>
real_eps)
THEN 609 dst(i)%elems(n)%v=src(i,j,k,l)
623 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: t
629 IF( abs(t(i)%elems(n)%v) .GE.
real_eps)
THEN 630 write(*,
"(A,ES12.5)")
"tensor["//trim(
str(i))//
"]["//trim(
str(j)) &
631 &//
"]["//trim(
str(k))//
"] = ",t(i)%elems(n)%v
641 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(IN) :: t
648 IF( abs(t(i)%elems(n)%v) .GE.
real_eps)
THEN 649 write(*,
"(A,ES12.5)")
"tensor["//trim(
str(i))//
"]["//trim(
str(j)) &
650 &//
"]["//trim(
str(k))//
"]["//trim(
str(l))//
"] = ",t(i)%elems(n)%v
665 SUBROUTINE sparse_mul3(coolist_ijk, arr_j, arr_k, res)
666 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
667 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_j, arr_k
668 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(OUT) :: res
672 DO n=1,coolist_ijk(i)%nelems
673 j=coolist_ijk(i)%elems(n)%j
674 k=coolist_ijk(i)%elems(n)%k
675 res(i) = res(i) + coolist_ijk(i)%elems(n)%v * arr_j(j)*arr_k(k)
689 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
690 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_k
691 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: res
695 DO n=1,coolist_ijk(i)%nelems
696 j=coolist_ijk(i)%elems(n)%j
698 k=coolist_ijk(i)%elems(n)%k
699 res(i,j) = res(i,j) + coolist_ijk(i)%elems(n)%v * arr_k(k)
714 SUBROUTINE sparse_mul4(coolist_ijkl, arr_j, arr_k, arr_l, res)
715 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(IN):: coolist_ijkl
716 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_j, arr_k, arr_l
717 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(OUT) :: res
721 DO n=1,coolist_ijkl(i)%nelems
722 j=coolist_ijkl(i)%elems(n)%j
723 k=coolist_ijkl(i)%elems(n)%k
724 l=coolist_ijkl(i)%elems(n)%l
725 res(i) = res(i) + coolist_ijkl(i)%elems(n)%v * arr_j(j)*arr_k(k)*arr_l(l)
739 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(IN):: coolist_ijkl
740 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_k, arr_l
741 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: res
745 DO n=1,coolist_ijkl(i)%nelems
746 j=coolist_ijkl(i)%elems(n)%j
748 k=coolist_ijkl(i)%elems(n)%k
749 l=coolist_ijkl(i)%elems(n)%l
750 res(i,j) = res(i,j) + coolist_ijkl(i)%elems(n)%v * arr_k(k) * arr_l(l)
766 SUBROUTINE jsparse_mul(coolist_ijk, arr_j, jcoo_ij)
767 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
768 TYPE(
coolist),
DIMENSION(ndim),
INTENT(OUT):: jcoo_ij
769 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_j
771 INTEGER :: i,j,k,n,nj,AllocStat
773 IF (jcoo_ij(i)%nelems/=0) stop
"*** jsparse_mul : Destination coolist not empty ! ***" 774 nj=2*coolist_ijk(i)%nelems
775 ALLOCATE(jcoo_ij(i)%elems(nj),
stat=allocstat)
776 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 778 DO n=1,coolist_ijk(i)%nelems
779 j=coolist_ijk(i)%elems(n)%j
780 k=coolist_ijk(i)%elems(n)%k
781 v=coolist_ijk(i)%elems(n)%v
784 jcoo_ij(i)%elems(nj)%j=j
785 jcoo_ij(i)%elems(nj)%k=0
786 jcoo_ij(i)%elems(nj)%v=v*arr_j(k)
791 jcoo_ij(i)%elems(nj)%j=k
792 jcoo_ij(i)%elems(nj)%k=0
793 jcoo_ij(i)%elems(nj)%v=v*arr_j(j)
810 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
811 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT):: jcoo_ij
812 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_j
817 DO n=1,coolist_ijk(i)%nelems
818 j=coolist_ijk(i)%elems(n)%j
819 k=coolist_ijk(i)%elems(n)%k
820 v=coolist_ijk(i)%elems(n)%v
821 IF (j /=0) jcoo_ij(i,j)=jcoo_ij(i,j)+v*arr_j(k)
822 IF (k /=0) jcoo_ij(i,k)=jcoo_ij(i,k)+v*arr_j(j)
835 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
836 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_j
837 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(OUT) :: res
841 DO n=1,coolist_ijk(i)%nelems
842 j=coolist_ijk(i)%elems(n)%j
843 res(i) = res(i) + coolist_ijk(i)%elems(n)%v * arr_j(j)
856 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
857 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(IN) :: arr_k
858 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(OUT) :: res
862 DO n=1,coolist_ijk(i)%nelems
863 k=coolist_ijk(i)%elems(n)%k
864 res(i) = res(i) + coolist_ijk(i)%elems(n)%v * arr_k(k)
874 TYPE(
coolist),
DIMENSION(ndim),
INTENT(INOUT):: tensor
876 INTEGER :: li,lii,liii,n
883 IF ((j==
tensor(i)%elems(lii)%j).AND.(k==
tensor(i)%elems(lii)%k))
THEN 922 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
923 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: dst
929 dst(i,src(i)%elems(n)%k)=src(i)%elems(n)%v
938 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
939 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: dst
945 dst(i,src(i)%elems(n)%j)=src(i)%elems(n)%v
971 INTEGER,
INTENT(IN) :: i
972 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
973 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: dst
978 dst(src(i)%elems(n)%j,src(i)%elems(n)%k)=src(i)%elems(n)%v
988 INTEGER,
INTENT(IN) :: j,k
989 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
990 REAL(KIND=8),
DIMENSION(ndim),
INTENT(OUT) :: dst
996 IF ((src(i)%elems(n)%j==j).and.(src(i)%elems(n)%k==k)) dst(i)=src(i)%elems(n)%v
1007 INTEGER,
INTENT(IN) :: j
1008 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN) :: src
1009 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: dst
1014 DO n=1,src(i)%nelems
1015 IF (src(i)%elems(n)%j==j) dst(i,src(i)%elems(n)%k)=src(i)%elems(n)%v
1028 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(IN):: coolist_ijkl
1029 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(IN) :: mat_jl
1030 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: res
1035 DO n=1,coolist_ijkl(i)%nelems
1036 j=coolist_ijkl(i)%elems(n)%j
1037 k=coolist_ijkl(i)%elems(n)%k
1038 l=coolist_ijkl(i)%elems(n)%l
1040 res(i,k) = res(i,k) + coolist_ijkl(i)%elems(n)%v * mat_jl(j,l)
1053 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(IN):: coolist_ijkl
1054 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(IN) :: mat_kl
1055 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(OUT) :: res
1060 DO n=1,coolist_ijkl(i)%nelems
1061 j=coolist_ijkl(i)%elems(n)%j
1062 k=coolist_ijkl(i)%elems(n)%k
1063 l=coolist_ijkl(i)%elems(n)%l
1065 res(i,j) = res(i,j) + coolist_ijkl(i)%elems(n)%v * mat_kl(k,l)
1079 TYPE(
coolist),
DIMENSION(ndim),
INTENT(IN):: coolist_ijk
1080 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(IN) :: mat_jk
1081 REAL(KIND=8),
DIMENSION(0:ndim),
INTENT(OUT) :: res
1086 DO n=1,coolist_ijk(i)%nelems
1087 j=coolist_ijk(i)%elems(n)%j
1088 k=coolist_ijk(i)%elems(n)%k
1090 res(i) = res(i) + coolist_ijk(i)%elems(n)%v * mat_jk(j,k)
1103 REAL(KIND=8),
DIMENSION(ndim,ndim),
INTENT(IN) :: src
1104 TYPE(
coolist),
DIMENSION(ndim),
INTENT(OUT) :: dst
1105 INTEGER :: i,j,n,AllocStat
1112 IF (dst(i)%nelems/=0) stop
"*** mat_to_coo : Destination coolist not empty ! ***" 1113 ALLOCATE(dst(i)%elems(n),
stat=allocstat)
1114 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 1121 dst(i)%elems(n)%v=src(i,j)
1133 REAL(KIND=8),
INTENT(IN) :: s
1134 TYPE(
coolist),
DIMENSION(ndim),
INTENT(INOUT) :: t
1139 t(i)%elems(li)%v=s*t(i)%elems(li)%v
1148 LOGICAL :: tensor_empty
1152 IF (t(i)%nelems /= 0)
THEN 1153 tensor_empty=.false.
1164 LOGICAL :: tensor4_empty
1166 tensor4_empty=.true.
1168 IF (t(i)%nelems /= 0)
THEN 1169 tensor4_empty=.false.
1181 CHARACTER (LEN=*),
INTENT(IN) :: s
1182 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(OUT) :: t
1183 INTEGER :: i,ir,j,k,l,n,AllocStat
1185 OPEN(30,file=s,status=
'old')
1189 ALLOCATE(t(i)%elems(n),
stat=allocstat)
1190 IF (allocstat /= 0) stop
"*** Not enough memory ! ***" 1194 READ(30,*) ir,j,k,l,v
1208 CHARACTER (LEN=*),
INTENT(IN) :: s
1209 TYPE(
coolist4),
DIMENSION(ndim),
INTENT(IN) :: t
1210 INTEGER :: i,j,k,l,n
1213 WRITE(30,*) i,t(i)%nelems
1218 WRITE(30,*) i,j,k,l,t(i)%elems(n)%v
integer ndim
Number of variables (dimension of the model)
subroutine, public add_matc_to_tensor4(i, j, src, dst)
Routine to add a matrix to a rank-4 tensor.
subroutine, public add_vec_ijk_to_tensor4(i, j, k, src, dst)
Routine to add a vector to a rank-4 tensor.
subroutine, public add_vec_jk_to_tensor(j, k, src, dst)
Routine to add a vector to a rank-3 tensor.
subroutine, public load_tensor4_from_file(s, t)
Load a rank-4 tensor coolist from a file definition.
subroutine, public tensor4_to_coo4(src, dst)
Routine to convert a rank-4 tensor from matrix to coolist representation.
subroutine, public simplify(tensor)
Routine to simplify a coolist (sparse tensor). For each index , it upper triangularize the matrix ...
subroutine, public copy_tensor(src, dst)
Routine to copy a rank-3 tensor.
subroutine, public sparse_mul4_with_mat_jl(coolist_ijkl, mat_jl, res)
Sparse multiplication of a rank-4 tensor coolist with a matrix : .
subroutine, public mat_to_coo(src, dst)
Routine to convert a matrix to a rank-3 tensor.
subroutine, public scal_mul_coo(s, t)
Routine to multiply a rank-3 tensor by a scalar.
subroutine, public coo_to_mat_i(i, src, dst)
Routine to convert a rank-3 tensor coolist component into a matrix.
subroutine, public sparse_mul3(coolist_ijk, arr_j, arr_k, res)
Sparse multiplication of a rank-3 tensor coolist with two vectors: .
subroutine, public coo_to_mat_j(j, src, dst)
Routine to convert a rank-3 tensor coolist component into a matrix.
subroutine, public tensor_to_coo(src, dst)
Routine to convert a rank-3 tensor from matrix to coolist representation.
subroutine, public coo_to_mat_ij(src, dst)
Routine to convert a rank-3 tensor coolist component into a matrix with i and j indices.
character(len=20) function, public str(k)
Convert an integer to string.
subroutine, public add_vec_ikl_to_tensor4_perm(i, k, l, src, dst)
Routine to add a vector to a rank-4 tensor plus permutation.
subroutine, public jsparse_mul(coolist_ijk, arr_j, jcoo_ij)
Sparse multiplication of two tensors to determine the Jacobian: It's implemented slightly differentl...
subroutine, public add_matc_to_tensor(i, src, dst)
Routine to add a matrix to a rank-3 tensor.
Coordinate list. Type used to represent the sparse tensor.
logical function, public tensor_empty(t)
Test if a rank-3 tensor coolist is empty.
subroutine, public sparse_mul4_with_mat_kl(coolist_ijkl, mat_kl, res)
Sparse multiplication of a rank-4 tensor coolist with a matrix : .
subroutine, public write_tensor4_to_file(s, t)
Load a rank-4 tensor coolist from a file definition.
subroutine, public jsparse_mul_mat(coolist_ijk, arr_j, jcoo_ij)
Sparse multiplication of two tensors to determine the Jacobian: It's implemented slightly differentl...
subroutine, public sparse_mul3_mat(coolist_ijk, arr_k, res)
Sparse multiplication of a rank-3 tensor coolist with a vector: . Its output is a matrix...
subroutine, public coo_to_mat_ik(src, dst)
Routine to convert a rank-3 tensor coolist component into a matrix with i and k indices.
subroutine, public add_to_tensor(src, dst)
Routine to add a rank-3 tensor to another one.
subroutine, public print_tensor4(t)
Routine to print a rank-4 tensor coolist.
subroutine, public sparse_mul2_j(coolist_ijk, arr_j, res)
Sparse multiplication of a 3d sparse tensor with a vectors: .
4d coordinate list. Type used to represent the rank-4 sparse tensor.
subroutine, public matc_to_coo(src, dst)
Routine to convert a matrix to a rank-3 tensor.
subroutine, public sparse_mul3_with_mat(coolist_ijk, mat_jk, res)
Sparse multiplication of a rank-3 tensor coolist with a matrix: .
subroutine, public add_vec_ikl_to_tensor4(i, k, l, src, dst)
Routine to add a vector to a rank-4 tensor.
subroutine, public sparse_mul2_k(coolist_ijk, arr_k, res)
Sparse multiplication of a rank-3 sparse tensor coolist with a vector: .
The model parameters module.
Coordinate list element type. Elementary elements of the sparse tensors.
logical function, public tensor4_empty(t)
Test if a rank-4 tensor coolist is empty.
4d coordinate list element type. Elementary elements of the 4d sparse tensors.
subroutine, public sparse_mul4(coolist_ijkl, arr_j, arr_k, arr_l, res)
Sparse multiplication of a rank-4 tensor coolist with three vectors: .
real(kind=8), parameter real_eps
Parameter to test the equality with zero.
subroutine, public sparse_mul4_mat(coolist_ijkl, arr_k, arr_l, res)
Sparse multiplication of a tensor with two vectors: .
subroutine, public coo_to_vec_jk(j, k, src, dst)
Routine to convert a rank-3 tensor coolist component into a vector.
subroutine, public print_tensor(t)
Routine to print a rank 3 tensor coolist.