29 u gridman_dbg,gridman_unit
35 INTEGER,
INTENT(IN) :: NINDEX
37 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NELEMENTS
39 INTEGER,
INTENT(OUT) :: IERR
44 w
WRITE(gridman_unit,*)
"Starting GRIDMAN_INDEX_ALLOCATE"
50 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ALLOCATE: ",
51 w
"could not perform deallocation"
56 IF(nindex.LT.1.OR.nelements.LT.1)
THEN
57 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ALLOCATE: ",
58 w
"incorrect dimension - array size"
59 WRITE(gridman_unit,*)
" NINDEX, NELEMENTS ",nindex,nelements
65 index%NELEMENTS=nelements
67 ALLOCATE(index%INDEXES(0:nindex,nelements),stat=st)
69 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ALLOCATE: ",
70 w
"cannot allocate the table of indices"
71 WRITE(gridman_unit,*)
" NINDEX, NELEMENTS ",nindex,nelements
76 ALLOCATE(index%COLUMNS(nindex),stat=st)
78 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ALLOCATE: ",
79 w
"cannot allocate the names of columns"
80 WRITE(gridman_unit,*)
" NINDEX",nindex
86 index%DESCRIPTION=
'Created by GRIDMAN_INDEX_ALLOCATE'
87 index%COLUMNS=
'NOT_DEFINED'
90 w
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_ALLOCATE finished"
103 INTEGER,
INTENT(OUT) :: IERR
108 w
WRITE(
gridman_unit,*)
"Starting GRIDMAN_INDEX_DEALLOCATE"
112 IF(
ALLOCATED(index%INDEXES))
THEN
113 DEALLOCATE(index%INDEXES,stat=st)
117 w
"WARNING from GRIDMAN_INDEX_DEALLOCATE: ",
118 w
"can not deallocate INDEXES"
122 IF(
ALLOCATED(index%COLUMNS))
THEN
123 DEALLOCATE(index%COLUMNS,stat=st)
127 w
"WARNING from GRIDMAN_INDEX_DEALLOCATE: ",
128 w
"can not deallocate COLUMNS"
133 w
WRITE(
gridman_unit,*)
"GRIDMAN_INDEX_DEALLOCATE finished"
150 u gridman_dbg,gridman_unit
152 INTRINSIC ALLOCATED,lbound,ubound
156 INTEGER,
INTENT(OUT) :: RES
158 INTEGER,
INTENT(OUT) :: IERR
160 INTEGER(GRIDMAN_SP) :: I1,I2
163 w
WRITE(gridman_unit,*)
"Starting GRIDMAN_INDEX_CHECK"
167 IF(.NOT.
ALLOCATED(index%INDEXES))
THEN
168 WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK: ",
169 w
"index is not allocated"
174 IF(index%NINDEX.LT.1.OR.index%NELEMENTS.LT.1)
THEN
175 WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK: ",
176 w
"incorrect dimensions"
177 WRITE(gridman_unit,*)
" NINDEX, NELEMENTS ",
178 w index%NINDEX, index%NELEMENTS
183 i1=lbound(index%INDEXES,1)
184 i2=lbound(index%INDEXES,2)
185 IF(i1.NE.0.OR.i2.NE.1)
THEN
186 WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK: ",
187 w
"incorrect low index of array"
188 WRITE(gridman_unit,*)
" Must be ",0,1
189 WRITE(gridman_unit,*)
" LBOUND(INDEX%INDEXES) ",i1,i2
194 i1=ubound(index%INDEXES,1)
195 i2=ubound(index%INDEXES,2)
196 IF(i1.NE.index%NINDEX.OR.i2.NE.index%NELEMENTS)
THEN
197 WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK: ",
198 w
"incorrect upper index of array"
199 WRITE(gridman_unit,*)
" NINDEX, NELEMENTS ",
200 w index%NINDEX,index%NELEMENTS
201 WRITE(gridman_unit,*)
" LBOUND(INDEX%INDEXES) ",i1,i2
206 IF(.NOT.
ALLOCATED(index%COLUMNS))
THEN
207 WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK: ",
208 w
"COLUMNS is not allocated"
212 i1=lbound(index%COLUMNS,1)
213 i2=ubound(index%COLUMNS,1)
214 IF(i1.NE.1.OR.i2.NE.index%NINDEX)
THEN
215 WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK: ",
216 w
"incorrect allocation of COLUMNS"
217 WRITE(gridman_unit,*)
" LBOUND, UBOUND, NINDEX ",
226 w
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_CHECK finished"
235 u gridman_dbg,gridman_unit,gridman_check,
236 u gridman_ver,gridman_lword
243 INTEGER,
INTENT(IN) :: IOUT
245 INTEGER,
INTENT(OUT) :: IERR
248 INTEGER(GRIDMAN_SP) :: IEL
252 w
WRITE(gridman_unit,*)
"Starting GRIDMAN_INDEX_WRITE"
256 IF(gridman_check)
THEN
258 IF(res.NE.0.OR.ierr.GT.0)
THEN
260 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_WRITE: ",
261 w
"incorrect index object"
262 WRITE(gridman_unit,*)
" Writing is skipped"
267 WRITE(iout,
'(A)',iostat=io)
'DATA-TYPE GRIDMAN_INDEX'
269 WRITE(iout,
'(A)',iostat=io)
'VERSION'
271 WRITE(iout,
'(I7)',iostat=io) gridman_ver
273 WRITE(iout,
'(A)',iostat=io)
"DESCRIPTION_LENGTH, WORD_LENGTH"
277 WRITE(iout,
'(A)',iostat=io)
'DESCRIPTION'
279 210
FORMAT(
'(A',i4,
')')
280 WRITE(iout,frm,iostat=io) index%DESCRIPTION
283 WRITE(iout,
'(A)',iostat=io)
"NINDEX, NELEMENTS"
285 WRITE(iout,
'(2I7)',iostat=io) index%NINDEX,index%NELEMENTS
288 WRITE(iout,
'(A)',iostat=io)
"COLUMNS"
290 WRITE(frm,215) gridman_lword
291 215
FORMAT(
'(A',i4,
')')
293 WRITE(iout,frm,iostat=io) index%COLUMNS(i)
298 f
WRITE(gridman_unit,*)
" GRIDMAN_INDEX_WRITE. Header finished"
300 WRITE(iout,
'(A)',iostat=io)
"INDEXES"
302 WRITE(frm,220) index%NINDEX+1
303 220
FORMAT(
'(',i4,
'I7)')
304 DO iel=1,index%NELEMENTS
305 WRITE(iout,frm,iostat=io) index%INDEXES(0:index%NINDEX,iel)
309 WRITE(iout,
'(A)',iostat=io)
"END OF DATA-TYPE GRIDMAN_INDEX"
313 w
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_WRITE finished"
318 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_WRITE: ",
319 w
"can not write to the file"
320 WRITE(gridman_unit,*)
" Writing is skipped"
328 u gridman_unit,gridman_dbg
330 INTRINSIC len_trim,min
334 INTEGER,
INTENT(IN) :: IIN
336 INTEGER,
INTENT(OUT) :: IERR
339 CHARACTER*128 :: SBUFF
340 INTEGER(GRIDMAN_SP) :: IEL,NELEMENTS,VER
341 INTEGER :: I,IO,DESCRIPTION_LENGTH,NINDEX,WORD_LENGTH
342 CHARACTER(LEN=GRIDMAN_LENGTH) :: DESCRIPTION
344 IF(gridman_dbg)
WRITE(gridman_unit,*)
345 f
"Starting GRIDMAN_INDEX_READ"
348 READ(iin,*,iostat=io) sbuff
350 READ(iin,*,iostat=io) sbuff
352 READ(iin,
'(I7)',iostat=io) ver
354 READ(iin,*,iostat=io) sbuff
356 READ(iin,
'(2I6)',iostat=io) description_length,word_length
358 READ(iin,*,iostat=io) sbuff
360 WRITE(frm,210) description_length
361 210
FORMAT(
'(A',i4,
')')
362 READ(iin,frm,iostat=io) description
364 READ(iin,*,iostat=io) sbuff
366 READ(iin,
'(3I7)',iostat=io) nindex,nelements
370 IF(ierr.NE.0)
GOTO 1000
372 index%DESCRIPTION=description
374 READ(iin,
'(A)',iostat=io) sbuff
376 WRITE(frm,215) word_length
377 215
FORMAT(
'(A',i4,
')')
379 READ(iin,frm,iostat=io) index%COLUMNS(i)
384 f
WRITE(gridman_unit,*)
" GRIDMAN_INDEX_READ. Header finished"
386 READ(iin,*,iostat=io) sbuff
388 WRITE(frm,220) index%NINDEX+1
389 220
FORMAT(
'(',i4,
'I7)')
391 READ(iin,frm,iostat=io) index%INDEXES(0:nindex,iel)
395 READ(iin,*,iostat=io) sbuff
398 IF(gridman_dbg)
WRITE(gridman_unit,*)
399 f
"GRIDMAN_INDEX_READ finished"
404 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_UNDEX_READ: ",
405 w
"can not read data"
407 1000
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_READ is terminated"
424 u gridman_unit,gridman_dbg,gridman_check
427 INTRINSIC any,llt,lgt,trim
433 INTEGER,
INTENT(OUT) :: RES
435 INTEGER,
INTENT(OUT) :: IERR
437 INTEGER(GRIDMAN_SP) :: IEL
441 w
WRITE(gridman_unit,*)
"Starting GRIDMAN_INDEX_COMPARE"
445 IF(gridman_check)
THEN
447 IF(res0.NE.0.OR.ierr.GT.0)
THEN
449 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_COMPARE: ",
450 w
"incorrect 1st index object"
451 WRITE(gridman_unit,*)
" Comparing is skipped"
455 IF(res0.NE.0.OR.ierr.GT.0)
THEN
457 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_COMPARE: ",
458 w
"incorrect 2nd index object"
459 WRITE(gridman_unit,*)
" Comparing is skipped"
464 IF(index1%NINDEX.NE.index2%NINDEX.OR.
465 f index1%NELEMENTS.NE.index2%NELEMENTS)
THEN
466 WRITE(gridman_unit,*)
467 w
"GRIDMAN_INDEX_COMPARE: dimensions are different"
468 WRITE(gridman_unit,*)
" INDEX1%NINDEX, INDEX2%NINDEX ",
469 w index1%NINDEX, index2%NINDEX
470 WRITE(gridman_unit,*)
" INDEX1%NELEMENTS, INDEX2%NELEMENTS ",
471 w index1%NELEMENTS, index2%NELEMENTS
477 DO iel=1,index1%NELEMENTS
478 IF(index1%INDEXES(0,iel).NE.index2%INDEXES(0,iel))
THEN
479 WRITE(gridman_unit,*)
480 w
"GRIDMAN_INDEX_COMPARE: index of elements is different"
481 WRITE(gridman_unit,*)
" IEL, INDEX1, INDEX2 ",
482 w iel,index1%INDEXES(0,iel),index2%INDEXES(0,iel)
486 IF(any(index1%INDEXES(1:n,iel).NE.
487 f index2%INDEXES(1:n,iel)))
THEN
488 WRITE(gridman_unit,*)
489 w
"GRIDMAN_INDEX_COMPARE: indices are different"
490 WRITE(gridman_unit,*)
" IEL ",iel
491 WRITE(gridman_unit,*)
" INDEX1 ",index1%INDEXES(1:n,iel)
492 WRITE(gridman_unit,*)
" INDEX2 ",index2%INDEXES(1:n,iel)
498 IF(llt(index1%DESCRIPTION,index2%DESCRIPTION).OR.
499 f lgt(index1%DESCRIPTION,index2%DESCRIPTION))
THEN
500 WRITE(gridman_unit,*)
501 w
"GRIDMAN_INDEX_COMPARE: descriptions are different"
502 WRITE(gridman_unit,*)
" INDEX1%DESCRIPTION ",
503 w trim(index1%DESCRIPTION)
504 WRITE(gridman_unit,*)
" INDEX2%DESCRIPTION ",
505 w trim(index2%DESCRIPTION)
511 IF(llt(index1%COLUMNS(i),index2%COLUMNS(i)).OR.
512 f lgt(index1%COLUMNS(i),index2%COLUMNS(i)))
THEN
513 WRITE(gridman_unit,*)
514 w
"GRIDMAN_INDEX_COMPARE: description of columns is different"
515 WRITE(gridman_unit,*)
" I ",i
516 WRITE(gridman_unit,*)
" INDEX1%COLUMNS(I) ",
517 w trim(index1%COLUMNS(i))
518 WRITE(gridman_unit,*)
" INDEX2%COLUMNS(I) ",
519 w trim(index2%COLUMNS(i))
528 w
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_COMPARE finished"
539 u gridman_check,gridman_dbg
547 INTEGER,
INTENT(OUT) :: IERR
555 IF(gridman_check)
THEN
557 IF(res.NE.0.OR.ierr.GT.0)
THEN
560 w
"incorrect input index object"
566 c index1%NELEMENTS,ierr)
570 index2%INDEXES=index1%INDEXES
571 index2%DESCRIPTION=index1%DESCRIPTION
572 index2%COLUMNS=index1%COLUMNS
587 u gridman_unit,gridman_dbg
592 INTEGER,
INTENT(OUT) :: IERR
594 LOGICAL :: GRIDMAN_INDEX_REPEATED_ELEMENTS
596 INTEGER(GRIDMAN_SP) :: I,IEL,NMIN,NMAX
597 LOGICAL,
ALLOCATABLE :: LELEMENT(:)
601 w
WRITE(gridman_unit,*)
"Staring GRIDMAN_INDEX_REPEATED_ELEMENTS"
605 nmin=minval(index%INDEXES(0,:))
606 nmax=maxval(index%INDEXES(0,:))
608 ALLOCATE(lelement(nmin:nmax),stat=st)
611 WRITE(gridman_unit,*)
612 w
"ERROR in GRIDMAN_INDEX_REPEATED_ELEMENTS: ",
613 w
"cannot allocate temporary array"
614 WRITE(gridman_unit,*)
" NMIN, NMAX ",nmin,nmax
615 gridman_index_repeated_elements=.true.
620 DO i=1,index%NELEMENTS
621 iel=index%INDEXES(0,i)
622 IF(lelement(iel))
THEN
623 lelement(iel)=.false.
625 gridman_index_repeated_elements=.true.
631 gridman_index_repeated_elements=.false.
634 w
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_REPEATED_ELEMENTS finished"
644 u gridman_unit,gridman_dbg,gridman_check
648 INTRINSIC ALLOCATED,minval,maxval
657 INTEGER(GRIDMAN_SP),
ALLOCATABLE :: ELMAP(:)
659 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: NMIN
661 INTEGER(GRIDMAN_SP),
INTENT(OUT) :: NMAX
665 INTEGER,
INTENT(OUT) :: IERR
667 INTEGER(GRIDMAN_SP) :: I,IEL
671 w
WRITE(gridman_unit,*)
"Staring GRIDMAN_INDEX_ELMAP"
675 IF(gridman_check)
THEN
677 IF(res.NE.0.OR.ierr.GT.0)
THEN
679 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ELMAP: ",
680 w
"incorrect index object"
687 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ELMAP: ",
688 w
"index has repeated elements"
689 WRITE(gridman_unit,*)
690 w
" Elements mapping can be generated only if"
691 WRITE(gridman_unit,*)
692 w
" only one combination of indices is defined for each element"
696 nmin=minval(index%INDEXES(0,:))
697 nmax=maxval(index%INDEXES(0,:))
699 IF(
ALLOCATED(elmap))
THEN
700 DEALLOCATE(elmap,stat=st)
703 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ELMAP: ",
704 w
"cannot re-allocate memory"
708 ALLOCATE(elmap(nmin:nmax),stat=st)
711 WRITE(gridman_unit,*)
"ERROR in GRIDMAN_INDEX_ELMAP: ",
712 w
"cannot allocate memory"
713 WRITE(gridman_unit,*)
" MIN, MAX ",nmin,nmax
718 DO i=1,index%NELEMENTS
719 iel=index%INDEXES(0,i)
724 w
WRITE(gridman_unit,*)
"GRIDMAN_INDEX_ELMAP finished"
734 u gridman_check,gridman_dbg
740 INTEGER(GRIDMAN_SP) ,
INTENT(IN) :: N
742 INTEGER,
INTENT(OUT) :: IERR
745 INTEGER(GRIDMAN_SP) :: IE
748 w
WRITE(
gridman_unit,*)
"Starting GRIDMAN_INDEX_CREATE121"
754 WRITE(
gridman_unit,*)
"GRIDMAN_INDEX_CREATE121 terminated"
759 index%INDEXES(0,ie)=ie
760 index%INDEXES(1,ie)=ie
763 index%DESCRIPTION=
"Created by GRIDMAN_INDEX_CREATE121"
764 index%COLUMNS(1)=
"ICELL"
766 IF(gridman_check)
THEN
768 IF(res.NE.0.OR.ierr.GT.0)
THEN
770 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_INDEX_CREATE121: ",
771 w
"incorrect resulting index object"
777 w
WRITE(
gridman_unit,*)
"GRIDMAN_INDEX_CREATE121 finished"
789 u gridman_check,gridman_dbg
797 INTEGER(GRIDMAN_SP),
INTENT(IN) :: IMAP12(2,n12)
799 INTEGER(GRIDMAN_SP),
INTENT(IN) :: N12
801 INTEGER,
INTENT(OUT) :: IERR
803 INTEGER(GRIDMAN_SP) :: N,IE,I,IE0,IE1,IE2
807 w
WRITE(
gridman_unit,*)
"Starting GRIDMAN_INDEX_TRANSFORM"
811 IF(gridman_check)
THEN
813 IF(res.NE.0.OR.ierr.GT.0)
THEN
815 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_INDEX_TRANSFORM: ",
816 w
"incorrect index object"
822 DO ie=1,index1%NELEMENTS
823 ie0=index1%INDEXES(0,ie)
835 WRITE(
gridman_unit,*)
"GRIDMAN_INDEX_TRANSFORM terminated"
840 DO ie=1,index1%NELEMENTS
841 ie0=index1%INDEXES(0,ie)
847 index2%INDEXES(0,n)=ie2
848 index2%INDEXES(1:,n)=index1%INDEXES(1:,ie)
853 index2%DESCRIPTION=index1%DESCRIPTION
854 index2%COLUMNS=index1%COLUMNS
857 IF(res.NE.0.OR.ierr.GT.0)
THEN
859 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_INDEX_TRANSFORM: ",
860 w
"the resulting index object is incorrect "
865 w
WRITE(
gridman_unit,*)
"GRIDMAN_INDEX_TRANSFORM completed"
881 u gridman_check,gridman_dbg
885 INTRINSIC minval,maxval,lgt,llt,trim
893 INTEGER,
INTENT(OUT) :: IERR
895 LOGICAL,
ALLOCATABLE :: LTAKE(:)
896 INTEGER(GRIDMAN_SP) :: IEMIN,IEMAX,I,IE,N,K
904 IF(gridman_check)
THEN
906 IF(res.NE.0.OR.ierr.GT.0)
THEN
909 w
"incorrect 1st object"
913 IF(res.NE.0.OR.ierr.GT.0)
THEN
916 w
"incorrect 2nd object"
921 IF(index1%NINDEX.NE.index2%NINDEX)
THEN
923 w
"indexes have different dimensions"
925 w index1%NINDEX,index2%NINDEX
930 iemin=minval(index2%INDEXES(0,:))
931 iemax=maxval(index2%INDEXES(0,:))
933 ALLOCATE(ltake(iemin:iemax),stat=st)
936 w
"cannot allocate temporary array"
945 DO i=1,index1%NELEMENTS
946 ie=index1%INDEXES(0,i)
947 IF(ie.GE.iemin.AND.ie.LE.iemax) ltake(ie)=.false.
951 DO i=1,index2%NELEMENTS
952 ie=index2%INDEXES(0,i)
964 index%INDEXES(:,1:index1%NELEMENTS)=index1%INDEXES
967 DO i=1,index2%NELEMENTS
968 ie=index2%INDEXES(0,i)
971 index%INDEXES(:,k)=index2%INDEXES(:,i)
975 DEALLOCATE(ltake,stat=st)
977 WRITE(
gridman_unit,*)
"WARNING from GRIDMAN_INDEX_MERGE: ",
978 w
"problems with memory deallocation"
983 IF(lgt(index1%DESCRIPTION,index2%DESCRIPTION).OR.
984 . llt(index1%DESCRIPTION,index2%DESCRIPTION))
THEN
985 index%DESCRIPTION=trim(index1%DESCRIPTION)//
986 /
' <- '//trim(index2%DESCRIPTION)
988 index%DESCRIPTION=trim(index1%DESCRIPTION)
993 IF(lgt(index1%COLUMNS(j),index2%COLUMNS(j)).OR.
994 . llt(index1%COLUMNS(j),index2%COLUMNS(j)))
THEN
995 index%COLUMNS(j)=trim(index1%COLUMNS(j))//
996 /
'-'//trim(index2%COLUMNS(j))
998 index%COLUMNS(j)=trim(index1%COLUMNS(j))
1003 IF(res.NE.0.OR.ierr.GT.0)
THEN
1004 WRITE(
gridman_unit,*)
"ERROR in GRIDMAN_INDEX_MERGE: ",
1005 w
"incorrect resulting index object"
subroutine gridman_index_create121(INDEX, N, IERR)
Create index table for "one-to-one" mapping.
subroutine gridman_index_check(INDEX, RES, IERR)
Check index object.
integer, parameter, public gridman_length
Length of the description strings.
integer, save, public gridman_unit
Index of the standard output unit.
Explicit interfaces to GRIDMAN subroutines and functions.
subroutine gridman_index_compare(INDEX1, INDEX2, RES, IERR)
Compare two index objects.
subroutine gridman_index_copy(INDEX2, INDEX1, IERR)
Create a copy of the index object.
subroutine gridman_index_transform(INDEX2, INDEX1, IMAP12, N12, IERR)
Transform indices of elements - IND(0,:)
subroutine gridman_index_allocate(INDEX, NINDEX, NELEMENTS, IERR)
Allocate index object.
logical, save, public gridman_dbg
Switch for debugging mode.
subroutine gridman_index_elmap(ELMAP, NMIN, NMAX, INDEX, IERR)
Create an aray which maps elements into the table of indices.
Data-type which stores indices defined on the grid cells or edges.
logical function gridman_index_repeated_elements(INDEX, IERR)
Check if the same element index appear more than once.
subroutine gridman_index_merge(INDEX, INDEX1, INDEX2, IERR)
Merge INDEX2 into INDEX1.
subroutine gridman_index_read(INDEX, IIN, IERR)
Read index object from file.
subroutine gridman_index_write(INDEX, IOUT, IERR)
Save index object in a file.
Definition of data types, global constants and variables.
subroutine gridman_index_deallocate(INDEX, IERR)
Allocate index object.
integer, parameter, public gridman_sp
Kind parameter for integer numbers.